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