我想使用现有列的新映射列追加到数据框,该列以给定的公共前缀开头。
例如,我输入
{"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列。
答案 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