繁体   English   中英

Pyspark Dataframe从具有字符串作为元素列表的列中获取唯一元素

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM