【问题标题】:Alternative of groupby in Pyspark to improve performance of Pyspark codePyspark 中 groupby 的替代方案以提高 Pyspark 代码的性能
【发布时间】:2020-12-30 09:41:43
【问题描述】:

我的 Pyspark 数据框如下所示。我必须从 pyspark 代码中删除按功能分组以提高代码的性能。我必须对 100k 数据执行操作。

[初始数据]

创建数据框

df = spark.createDataFrame([
(0, ['-9.53', '-9.35', '0.18']),
(1, ['-7.77', '-7.61', '0.16']),
(2, ['-5.80', '-5.71', '0.10']),
(0, ['1', '2', '3']),
(1, ['4', '5', '6']),
(2, ['8', '98', '32'])
 ], ["id", "Array"])

使用此代码产生预期的输出。

import pyspark.sql.functions as f

df.groupBy('id').agg(f.collect_list(f.col("Array")).alias('Array')).\
select("id",f.flatten("Array")).show()

我必须实现这种格式的输出。上面的代码给了我这个输出。我必须通过删除 groupby 函数来达到同样的目的。

+---+-------------------------------+
|id |flatten(Array)                 |
+---+-------------------------------+
|0  |[-9.53, -9.35, 0.18, 1, 2, 3]  |
|1  |[-7.77, -7.61, 0.16, 4, 5, 6]  |
|2  |[-5.80, -5.71, 0.10, 8, 98, 32]|
+---+-------------------------------+

【问题讨论】:

    标签: apache-spark pyspark apache-spark-sql


    【解决方案1】:

    如果不想分组,可以使用窗口函数:

    import pyspark.sql.functions as f
    from pyspark.sql.window import Window
    
    df2 = df.select(
        "id",
        f.flatten(f.collect_list(f.col("Array")).over(Window.partitionBy("id"))).alias("Array")
    ).distinct()
    
    df2.show(truncate=False)
    +---+-------------------------------+
    |id |Array                          |
    +---+-------------------------------+
    |0  |[-9.53, -9.35, 0.18, 1, 2, 3]  |
    |1  |[-7.77, -7.61, 0.16, 4, 5, 6]  |
    |2  |[-5.80, -5.71, 0.10, 8, 98, 32]|
    +---+-------------------------------+
    

    你也可以试试

    df.select(
        'id', 
        f.explode('Array').alias('Array')
    ).groupBy('id').agg(f.collect_list('Array').alias('Array'))
    

    虽然我不确定它是否会更快。

    【讨论】:

    • 感谢您的回答。您提供的解决方案与使用我的代码执行操作的时间相同(大约 3 分钟)。我正在寻找一种至少在 1 分钟内完成操作的解决方案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多