[英]Pyspark Dataframe get unique elements from column with string as list of elements
我有一个数据框(它是通过从天蓝色的多个blob加载而创建的),其中有一个列是ID列表。 现在,我希望从此整列中获得唯一ID的列表:
这是一个例子-
df -
| col1 | col2 | col3 |
| "a" | "b" |"[q,r]"|
| "c" | "f" |"[s,r]"|
这是我的预期答复:
resp = [q, r, s]
知道如何到达那里吗?
我目前的方法是将col3中的字符串转换为python列表,然后以某种方式将其变平。
但是到目前为止,我还不能这样做。 我尝试在pyspark中使用用户定义的函数,但它们仅返回字符串,而不返回列表。
FlatMap仅适用于RDD,不适用于数据框,因此它们不可见。
也许我可以在从RDD到数据帧的转换过程中指定此方法。 但是不知道该怎么做。
我们可以将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']
不确定性能。 希望这可以帮助。!
这是仅使用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()
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.