Pyspark Dataframe从列中获取唯一元素,并将字符串作为元素列表

时间:2017-12-13 12:47:16

标签: python dataframe pyspark spark-dataframe rdd

我有一个数据框(通过从azure中的多个blob加载创建),其中我有一列ID列表。 现在,我需要整个列中的唯一ID列表:

这是一个例子 -

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

以下是我的预期回复:

resp = [q, r, s]

知道如何到达那里吗?

我目前的方法是将col3中的字符串转换为python列表,然后以某种方式将它们展开。

但到目前为止,我无法这样做。我尝试在pyspark中使用用户定义的函数,但它们只返回字符串而不是列表。

FlatMaps仅适用于RDD,而不适用于Dataframe,因此它们不在图片中。

也许我可以在从RDD到数据帧的转换过程中指定它。但不知道该怎么做。

2 个答案:

答案 0 :(得分:1)

我们可以将UDF与collect_list一起使用。我试过了,

>>> 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']

不确定性能。希望这有帮助。!

答案 1 :(得分:1)

以下是仅使用DataFrame函数的方法:

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()