首页 > 解决方案 > Spark Scala:如何向函数发送超过 10 列

问题描述

我正在寻找将多个 spark.sql.columns 发送到函数的理想方式的指针(没有单独提及它们)。目前我将单个列传递给函数以派生新列,但我需要将多个列发送到函数。关于如何选择特定列的任何建议说“Flag1”、“Flag2”等并作为结构或其他方式发送?并且能够访问被调用函数中的列名称及其值,类似于我在下面的函数中所做的事情?

例如:这里只提到 3 列,但我有大约 25 列以上,并且需要其中近 10 列才能使用。

var data = Seq(("10","value1","value2"), ("20","value2","value3"), ("30","value4","value5")).toDF( "id","Flag1","Flag2")

data.withColumn("newCol",doSomething($"Flag1")).show(5)

def doSomething(flag:Column): Column ={
    when(flag.isNotNull && flag === lit("value4"),"abc")
    .when(flag.isNotNull && flag === lit("vaue5"),"xyz")
    .otherwise(lit("unknown"))
    
}

提前感谢您的指导。

标签: scalaapache-spark

解决方案


为什么你不在函数定义中有多个参数?

例如

data.withColumn("newcolumn", doSomething(data.columns.map(col))) 

def doSomething(flags: Array[Column]): Column = {
    flag1 = flags(0)
    flag2 = flags(1)
    when(flag1.isNotNull && flag2 === lit("value4"),"abc")
    .when(flag1.isNotNull && flag2 === lit("vaue5"),"xyz")
    .otherwise(lit("unknown"))
}

推荐阅读