【问题标题】:Summing multiple columns in Spark在 Spark 中对多列求和
【发布时间】:2017-11-14 02:04:52
【问题描述】:

如何在 Spark 中对多个列求和?例如,在 SparkR 中,以下代码可用于获取一列的总和,但如果我尝试获取 df 中两列的总和,则会出现错误。

# Create SparkDataFrame
df <- createDataFrame(faithful)

# Use agg to sum total waiting times
head(agg(df, totalWaiting = sum(df$waiting)))
##This works

# Use agg to sum total of waiting and eruptions
head(agg(df, total = sum(df$waiting, df$eruptions)))
##This doesn't work

SparkR 或 PySpark 代码都可以工作。

【问题讨论】:

    标签: apache-spark pyspark sparkr


    【解决方案1】:

    对于 PySpark,如果您不想明确输入列:

    from operator import add
    from functools import reduce
    new_df = df.withColumn('total',reduce(add, [F.col(x) for x in numeric_col_list]))
    

    【讨论】:

    • 为什么这个工具不在 spark api 中?
    • 这是一种有用的技术,肯定会帮助许多在谷歌上搜索这个问题的人,但不是原始问题所问的:)(它询问的是聚合,而不是行操作)
    【解决方案2】:

    sparkR 代码:

    library(SparkR)
    df <- createDataFrame(sqlContext,faithful)
    w<-agg(df,sum(df$waiting)),agg(df,sum(df$eruptions))
    head(w[[1]])
    head(w[[2]])
    

    【讨论】:

      【解决方案3】:
      org.apache.spark.sql.functions.sum(Column e)
      

      聚合函数:返回表达式中所有值的总和。

      如您所见,sum 仅将一列作为输入,因此sum(df$waiting, df$eruptions) 将不起作用。由于您想对数字字段求和,您可以使用sum(df("waiting") + df("eruptions"))。如果您想为各个值求和然后列,你可以df.agg(sum(df$waiting),sum(df$eruptions)).show

      【讨论】:

      • 对我来说,这个工作df.withColumn("newCol", col("col1")+col("col2"))
      • @Ali 是的,这也是一种选择。
      • 我理解的原始问题是关于聚合:“垂直”对列求和(对于每一列,对所有行求和),而不是行操作:“水平”求和行(对于每一行,将该行列中的值相加)。
      【解决方案4】:

      您可以在 pyspark 中执行以下操作

      >>> from pyspark.sql import functions as F
      >>> df = spark.createDataFrame([("a",1,10), ("b",2,20), ("c",3,30), ("d",4,40)], ["col1", "col2", "col3"])
      >>> df.groupBy("col1").agg(F.sum(df.col2+df.col3)).show()
      +----+------------------+
      |col1|sum((col2 + col3))|
      +----+------------------+
      |   d|                44|
      |   c|                33|
      |   b|                22|
      |   a|                11|
      +----+------------------+
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-01-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多