java - Spark Sql 中的poseexplode() 的替代方案是什么,因为它不动态采用可变数量的参数?

标签 java scala apache-spark

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

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

最佳答案

从函数 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 函数。

关于java - Spark Sql 中的poseexplode() 的替代方案是什么,因为它不动态采用可变数量的参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56894144/

相关文章:

java - Android 异步任务回收位图

json - Scala Play Json 中 JsPath 到数组

eclipse - 在 maven 项目中运行 scala 应用程序

scala - 执行外部命令

java - 如何在使用 Maven 创建 Jar 时使用依赖项在本地运行代码并排除它们

java - 如何从Java Spark中的collect_list创建的列中获取第一个和最后一个元素

java - 如何通过 SOCKS 代理使用 URLConnection?

java - 如何根据 CPU 内核扩展线程?

java - 如何检查 Java 程序是否保持打开文件句柄?

apache-spark - 将数据写入Hive Spark SQL时发生ArrayIndexOutOfBoundsException异常