Spark-将新列添加到具有与给定模式Scala匹配的列的数据框中

时间:2019-03-08 19:34:46

标签: scala apache-spark

我想使用现有列的新映射列追加到数据框,该列以给定的公共前缀开头。

例如,我输入

{"Prefix_A": "v_A", "Prefix_B": "v_B", "Field": "v"}, {"Prefix_A": "v_A", "Prefix_B": "v_B", "Prefix_C": "v_C", "Field": "v"}

我想将所有带有前缀“ Prefix_”的字段组合在一起,并获得输出

{"NewColumn": {"Prefix_A": "v_A", "Prefix_B": "v_B"}, "Field": "v"}, {"NewColumn": {"Prefix_A": "v_A", "Prefix_B": "v_B", "Prefix_C": "v_C"}, "Field": "v"}

我想即时执行此操作,即我不知道这些列,因为数据是无模式json转储。

此外,我想构造一个与给定正则表达式匹配的现有列的​​新map列。

1 个答案:

答案 0 :(得分:1)

假设您有一个包含json条目的输入文件data.json,则可以使用以下代码获得预期的输出:

import org.apache.spark.sql.functions.{col,struct}
import spark.implicits._

val df = spark.read.json("data.json")
val (prefixedColumns, otherColumns) = df.columns.partition(_.startsWith("Prefix"))
val transformedDf = df.select(
    struct(prefixedColumns.map(col):_*).as("NewColumn")
    +: otherColumns.map(col):_*)
transformedDf.write.json("output.json")

基本上,您可以使用必要的函数重新创建新的列列表,然后使用scala :_*表示法将它们应用于select中,以将序列转换为varargs