【问题标题】:Spark: Scala - apply function to a list in a DataFrame [duplicate]Spark:Scala - 将函数应用于DataFrame中的列表[重复]
【发布时间】:2019-04-03 10:39:17
【问题描述】:

我正在尝试将求和函数应用于 spark 中数据框列的每个单元格。每个单元格都包含一个我想加起来的整数列表。 但是,我得到的错误是:

console:357: 错误:值总和不是 org.apache.spark.sql.ColumnName

下面的示例脚本。

import org.apache.spark.sql.SparkSession
import org.apache.spark.sql.functions._

val spark = SparkSession.builder().getOrCreate()  

val df = spark.createDataFrame(Seq(
  (0, List(1,2,3)),
  (1, List(2,2,3)),
  (2, List(3,2,3)))).toDF("Id", "col_1")

val test = df.withColumn( "col_2", $"col_1".sum )

test.show()

【问题讨论】:

    标签: scala list apache-spark dataframe sum


    【解决方案1】:

    您可以定义一个 UDF。

    scala> def sumFunc(a: Seq[Int]): Int = a.sum
    sumFunc: (a: Seq[Int])Int
    
    scala> val sumUdf = udf(sumFunc(_: Seq[Int]))
    sumUdf: org.apache.spark.sql.expressions.UserDefinedFunction = UserDefinedFunction(<function1>,IntegerType,Some(List(ArrayType(IntegerType,false))))
    
    scala> val test = df.withColumn( "col_2", sumUdf($"col_1") )
    test: org.apache.spark.sql.DataFrame = [Id: int, col_1: array<int> ... 1 more field]
    
    scala> test.collect
    res0: Array[org.apache.spark.sql.Row] = Array([0,WrappedArray(1, 2, 3),6], [1,WrappedArray(2, 2, 3),7], [2,WrappedArray(3, 2, 3),8])
    

    【讨论】:

    • 有没有办法不用udf?
    猜你喜欢
    • 2020-11-15
    • 2016-05-15
    • 1970-01-01
    • 2017-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-18
    • 2012-09-26
    相关资源
    最近更新 更多