将 Pyspark 数据框转换为具有实际值的列表
Posted
技术标签:
【中文标题】将 Pyspark 数据框转换为具有实际值的列表【英文标题】:Covert a Pyspark Dataframe into a List with actual values 【发布时间】:2020-04-22 00:46:51 【问题描述】:我正在尝试将 Pyspark 数据框列转换为 NOT 对象的值列表。
现在我的最终目标是将它用作过滤另一个数据帧的过滤器。
我尝试了以下方法:
X = df.select("columnname").collect()
但是当我用它来过滤时,我无法做到。
Y = dtaframe.filter(~dtaframe.columnname.isin(X)))
另外,尝试转换成numpy数组并聚合collect_list()
df.groupby('columnname').agg(collect_list(df["columnname"])
请指教。
【问题讨论】:
试试dataframe.filter(~F.col("columnname").isin([x[0] for x in df.select("columname").collect()]))
需要时间但有效!谢谢。
collect
每次列表命中时都会执行。尝试将收集分配给一个变量,然后像a=df.select("columnname").collect()
然后dataframe.filter(~F.col("columnname").isin([x[0] for x in a]))
那样遍历它,所以它只收集一次
left_anti join
超过 collect()_then_filter
任何一天。对于大数据,您根本无法collect()
。 @anky
@MohammadMurtazaHashmi 谢谢,是的,我也这么想
【参考方案1】:
Collect 函数通过从执行器收集数据返回一个行对象数组。如果您需要原生数据类型的值数组,则必须显式处理它以从行对象中获取列。
此代码创建列号为 LongType 的 DF。
df = spark.range(0,10,2).toDF("number")
将其转换为 python 列表。
num_list = [row.number for row in df.collect()]
现在这个列表可以在任何数据框中使用 isin 函数过滤值。
df1 = spark.range(10).toDF("number")
df1.filter(~col("number").isin(num_list)).show()
【讨论】:
以上是关于将 Pyspark 数据框转换为具有实际值的列表的主要内容,如果未能解决你的问题,请参考以下文章
Pyspark/SQL 将具有列表值的列连接到另一个数据框列
将标准 python 键值字典列表转换为 pyspark 数据框