Spark-将新列添加到数据框架中,并匹配给定的模式Scala



我想用现有列的新地图列附加到数据框,该列以给定的公共前缀开头。

例如,我的输入

{"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转储,我不知道这些列。

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

假设您有一个包含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

最新更新