Scala与Spark下拆分字符串提取指定字段生成目标DataFrame
实现方案
推荐优先使用转Map的稳健实现,不受字段顺序变化、缺省字段影响:
方案1:键值对转Map提取(推荐)
import org.apache.spark.sql.functions._ // 原有数据集 var df = Seq(("column1=a1;column2=a2;column3=a3;column4=a4;column5=a5;column6=a6;column7=a7;column8=a8;column9=a9;column10=a10")).toDF("custom") // 将custom字段转为键值对Map,参数依次为输入列、键值对分隔符、键值分隔符 val dfWithMap = df.withColumn("kv_map", str_to_map(col("custom"), ";", "=")) // 直接从Map中提取目标字段 val resultDf = dfWithMap.select( col("kv_map").getItem("column2").as("column2"), col("kv_map").getItem("column4").as("column4"), col("kv_map").getItem("column6").as("column6") ) // 查看结果 resultDf.show()
运行输出示例:
+-------+-------+-------+ |column2|column4|column6| +-------+-------+-------+ | a2| a4| a6| +-------+-------+-------+
方案2:基于原有拆分逻辑改造(仅适用字段顺序固定场景)
如果可以确保所有行的字段严格按column1到column10的顺序排列,无缺省、无顺序调换,可以直接修改原有代码的select逻辑:
val df2 = df.withColumn("temp_new", split(col("custom"), "\\;")).select( col("temp_new").getItem(1).as("column2"), col("temp_new").getItem(3).as("column4"), col("temp_new").getItem(5).as("column6") ) df2.show()
内容的提问来源于stack exchange,提问作者Rachana Gandhi
相关产品推荐
相关产品推荐

