【问题标题】:Applying User Function to Entire Spark DataFrame column将用户函数应用于整个 Spark DataFrame 列
【发布时间】:2016-11-29 03:24:04
【问题描述】:

Spark DataFrame 架构:

In [177]: testtbl.printSchema()
root
 |-- Date: long (nullable = true)
 |-- Close: double (nullable = true)
 |-- Volume: double (nullable = true)

我希望在testtbl 的列中应用一个标量值函数。假设我希望计算“关闭”列的平均值。对于 rdd,我会做类似

rdd.fold(0, lambda x,y: x+y)

但是testtbl.Close 不是一个rdd,它是一个功能有限的列对象。 testtbl 的行是 rdds,列不是。那么如何将add,或者一个用户函数应用到单个列呢?

【问题讨论】:

    标签: apache-spark pyspark spark-dataframe


    【解决方案1】:

    如果要将函数应用于整个列,只需对该列执行聚合操作即可。

    例如,假设您想计算values 列中所有值的sum。尽管df 不是聚合数据,但将聚合函数应用于DataFrames 是有效的。

    from pyspark.sql.functions import *
    
    df = sc.parallelize([(1,), (2,), (3,)]).toDF(["values"])
    df.agg(sum("values").alias("sum")).show()
    
    +---+
    |sum|
    +---+
    |  6|
    +---+
    

    您可以在Pyspark's aggregation documentation 中找到另一个示例。

    关于你问题的第二部分。你可以创建一个User Defined Aggregated Function,但如果我是对的,它只适用于Scala

    【讨论】:

    • Ok - aggdf.groupBy.agg()', but agg 的简写,根据 documentation 仅支持 5 个左右的功能。我想将 udf 应用于列(问题的第二部分)。
    • my_user_fn(testtbl.rdd.map(lambda row: row.Close).collect()) ?,但效率低下且不返回 df。
    • 是的 - udf 的逐行应用是标准的,我正在寻找一个 udaf。看起来它仅在 Scala 中可用。谢谢。
    猜你喜欢
    • 2016-05-15
    • 2017-10-18
    • 1970-01-01
    • 2020-12-28
    • 1970-01-01
    • 2017-03-16
    • 2012-09-26
    • 1970-01-01
    • 2019-06-26
    相关资源
    最近更新 更多