Spark Sql中posexplode()的替代方法是什么,因为它没有动态获取可变数量的参数?

时间:2019-07-04 20:56:11

标签: java scala apache-spark

val result = df.select($"seq_id", posexplode(array($"prod_id", $"prod_name")))

在上面的示例中,posexplode在side array()中不采用任何列名序列。必须对列名称进行硬编码。有什么方法可以删除硬编码并动态添加任意数量的列?

1 个答案:

答案 0 :(得分:1)

从函数declaration array(cols: Column*): Column可以看出,我们可以将一个或多个col作为数组函数的参数传递。也可以通过从任意字符串列表生成列数组来动态完成此操作:

import org.apache.spark.sql.functions.{posexplode, col, array}

val cols = Seq("prod_id", "prod_name").map{col(_)}
val customArray = array(cols:_*)

df.select(customArray).show

这会将prod_id, prod_name封装到数组中,并且像以前一样使用array函数。