将 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 数据框

Pyspark/SQL 将具有列表值的列连接到另一个数据框列

将标准 python 键值字典列表转换为 pyspark 数据框

PySpark Dataframe 将两列转换为基于第三列值的元组新列

将列表转换为 pyspark 数据框

将多个火花数据框列转换为具有列表类型的单列