【问题标题】:How to write Pyspark UDAF on multiple columns?如何在多列上编写 Pyspark UDAF?
【发布时间】:2018-02-21 13:55:21
【问题描述】:

我在名为 end_stats_df 的 pyspark 数据框中有以下数据:

values     start    end    cat1   cat2
10          1        2      A      B
11          1        2      C      B
12          1        2      D      B
510         1        2      D      C
550         1        2      C      B
500         1        2      A      B
80          1        3      A      B

我想通过以下方式聚合它:

  • 我想使用“开始”和“结束”列作为聚合键
  • 对于每组行,我需要执行以下操作:
    • 计算cat1cat2 中该组的唯一值数。例如,对于start=1 和end=2 的组,这个数字将是4,因为有A、B、C、D。这个数字将被存储为n(本例中n=4) .
    • 对于values 字段,对于每个组,我需要对values 进行排序,然后选择每个n-1 值,其中n 是上面第一个操作中存储的值。
    • 在聚合结束时,我真的不关心在上述操作之后cat1cat2 中的内容。

上面示例的示例输出是:

values     start    end    cat1   cat2
12          1        2      D      B
550         1        2      C      B
80          1        3      A      B

如何使用 pyspark 数据框完成?我假设我需要使用自定义 UDAF,对吗?

【问题讨论】:

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


    【解决方案1】:

    Pyspark 不直接支持UDAF,所以我们必须手动进行聚合。

    from pyspark.sql import functions as f
    
    def func(values, cat1, cat2):
        n = len(set(cat1 + cat2))
        return sorted(values)[n - 2]
    
    
    df = spark.read.load('file:///home/zht/PycharmProjects/test/text_file.txt', format='csv', sep='\t', header=True)
    df = df.groupBy(df['start'], df['end']).agg(f.collect_list(df['values']).alias('values'),
                                                f.collect_set(df['cat1']).alias('cat1'),
                                                f.collect_set(df['cat2']).alias('cat2'))
    df = df.select(df['start'], df['end'], f.UserDefinedFunction(func, StringType())(df['values'], df['cat1'], df['cat2']))
    

    【讨论】:

    • 那太好了,我会尝试并报告给你,谢谢。
    • 在您的示例中f 是什么?
    • 没关系,我看到它是来自 pyspark 导入的“函数”。
    • 此方法使用collect 将数据带到驱动程序。这违背了火花的目的。在这种情况下,@Marco 提到的启用了熊猫的 UDAF 可能会稍微好一些。但是这些解决方案对我不起作用,因为我的 UDF 需要应用于 pyspark 数据帧而不是 pandas。有没有其他方法可以在 pyspark 数据帧上应用聚合的 UDF?
    • @thentangler:UDAF 是用于.. pyspark 的聚合 UDF。 google.com/search?q=pyspark+UDAF+2.4.4
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-02
    • 1970-01-01
    相关资源
    最近更新 更多