【问题标题】:Covert a Pyspark Dataframe into a List with actual values将 Pyspark 数据框转换为具有实际值的列表
【发布时间】: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 谢谢,是的,我也这么想

标签: pyspark apache-spark-sql


【解决方案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()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-03-16
    • 1970-01-01
    • 1970-01-01
    • 2020-01-18
    • 2023-01-13
    • 2021-05-21
    • 2019-05-24
    相关资源
    最近更新 更多