2017-12-13 1 views
0

IDの列である列を持つデータフレーム(azureの複数のブロブからロードすることによって作成されます)があります。Pyspark Dataframeは、列から要素のリストとして文字列を持つユニークな要素を取得します。

resp = [q, r, s] 

任意のアイデアどのようにそこに着くために: - : 今、私はこの全体の列からユニークIDのリストたい。ここ

df - 
| col1 | col2 | col3 | 
| "a" | "b" |"[q,r]"| 
| "c" | "f" |"[s,r]"| 

私の期待応答がされる。ここ

を例です。 ?

私の現在のアプローチは、col3の文字列をPythonリストに変換して、何とかそれらをフラットアウトすることです。

これまでのところ私はそうすることができません。私はpysparkでユーザ定義の関数を使ってみましたが、リストではなく文字列を返します。

フラットマップは、データフレーム上にないRDDでのみ動作し、画像がありません。

多分、RDDからデータフレームへの変換中にこれを指定できる方法があります。しかし、それをどうやって行うのか分からない。

答えて

1

collect_listとともにUDFを使用できます。私は自分の道を試みました

>>> from pyspark.sql import functions as F 
>>> from pyspark.sql.types import * 
>>> from functools import reduce 

>>> df = spark.createDataFrame([('a','b','[q,r]'),('c','f','[s,r]')],['col1','col2','col3']) 
>>> df.show() 
+----+----+-----+ 
|col1|col2| col3| 
+----+----+-----+ 
| a| b|[q,r]| 
| c| f|[s,r]| 
+----+----+-----+ 

>>> udf1 = F.udf(lambda x : [v for v in reduce(lambda x,y : set(x+y),d) if v not in ['[',']',',']],ArrayType(StringType())) 
## col3 value is string of list. we concat the strings and set over it which removes duplicates. 
## Also, we have converted string to set, means it will return [ ] , as values(like '[',']',',').we remove those. 

>>> df.select(udf1(F.collect_list('col3')).alias('col3')).first().col3 
['q', 'r', 's'] 

パフォーマンスについてはわかりません。お役に立てれば。!ここ

0

は、データフレームの機能を利用する方法である:

df = spark.createDataFrame([('a','b','[q,r,p]'),('c','f','[s,r]')],['col1','col2','col3']) 

df=df.withColumn('col4', f.split(f.regexp_extract('col3', '\[(.*)\]',1), ',')) 

df.select(f.explode('col4').alias('exploded')).groupby('exploded').count().show() 
関連する問題