2017-09-18 6 views
1

内WrappedArraysをマージ:Pysparkは現在Pysparkのデータフレームは、このような構造(col2のWrappedArraysのリスト)を持っているDATAFRAME

+---+---------------------------------------------------------------------+ 
|id |col2                 | 
+---+---------------------------------------------------------------------+ 
|a |[WrappedArray(code2), WrappedArray(code1, code3)]     | 
+---+---------------------------------------------------------------------+ 
|b |[WrappedArray(code5), WrappedArray(code6, code8)]     | 
+---+---------------------------------------------------------------------+ 

これは私が持っていると思い構造(col2の平坦化リスト)であります

+---+---------------------------------------------------------------------+ 
|id |col2                 | 
+---+---------------------------------------------------------------------+ 
|a |[code2,code1, code3)]            | 
+---+---------------------------------------------------------------------+ 
|b |[code5,code6, code8]             | 
+---+---------------------------------------------------------------------+ 

しかし、私はその変換を行う方法がわかりません。私はフラットマップをしようとしましたが、それはうまくいかないようです。助言がありますか?

+1

flatMapを行うには間違った方法です。フラットマップは行を複製します。 try map –

答えて

1

リストのリストを入力として受け取り、すべての要素を含む単一のリストを返すudfを適用します。それが明確でない場合は、例を掲載します。それがあなたの問題を解決するかどうか教えてください。

+0

これは質問に対する答えを提供しません。批評をしたり、著者の説明を求めるには、投稿の下にコメントを残してください。 - [レビューの投稿](レビュー/低品質の投稿/ 18603450) – thewaywewere

+0

これからも同じことをやりますよね –

3

これは2つの方法、udfとrddを使用して行うことができます。ここでは一例です: -

df = sqlContext.createDataFrame([ 
    ['a', [['code2'],['code1', 'code3']]], 
    ['b', [['code5','code6'], ['code8']]] 
], ["id", "col2"]) 
df.show(truncate = False) 
+---+-------------------------------------------------+ 
|id |col2            | 
+---+-------------------------------------------------+ 
|a |[WrappedArray(code2), WrappedArray(code1, code3)]| 
|b |[WrappedArray(code5, code6), WrappedArray(code8)]| 
+---+-------------------------------------------------+ 

RDD: -

df.map(lambda row:(row[0], reduce(lambda x,y:x+y, row[1]))).toDF().show(truncate=False) 
+---+---------------------+ 
|_1 |_2     | 
+---+---------------------+ 
|a |[code2, code1, code3]| 
|b |[code5, code6, code8]| 
+---+---------------------+ 

UDF: -

from pyspark.sql import functions as F 
import pyspark.sql.types as T 
def fudf(val): 
    #emlist = [] 
    #for item in val: 
    # emlist += item 
    #return emlist 
    return reduce (lambda x, y:x+y, val) 
flattenUdf = F.udf(fudf, T.ArrayType(T.StringType())) 
df.select("id", flattenUdf("col2").alias("col2")).show(truncate=False) 
+---+---------------------+ 
|id |col2     | 
+---+---------------------+ 
|a |[code2, code1, code3]| 
|b |[code5, code6, code8]| 
+---+---------------------+ 
+1

ありがとう!これらは素晴らしいものであり、問​​題を確実に解決します。 1つの小さな修正:RDDの例をdf.map()の代わりにdf.rdd.map()に更新してください。 – Eka

+0

@Eka回答があなたの問題に対処したので、親切に受け入れてください(回答は回答者にとって貴重な時間を要します) – desertnaut

関連する問題