Spark 2.x Scala:如何动态映射无表头竖线分隔文本的Schema?
Spark Scala读取竖线分隔无表头文件并映射Schema解决方案
问题原因
你的代码中split("|")逻辑错误:|是正则表达式的特殊元字符,直接使用会将字符串拆分为单个字符,这就是输出仅显示单个数字的根本原因。必须对|进行转义处理。
正确实现方案
方案1:使用Spark原生CSV数据源(推荐)
Spark的CSV数据源原生支持竖线分隔符,无需手动拆分字符串,效率更高且更稳定:
import org.apache.spark.sql.SparkSession val spark = SparkSession.builder().appName("PipeDelimitedFileProcessing").getOrCreate() // 读取无表头的竖线分隔文件 val rawDf = spark.read .option("sep", "|") .option("header", "false") .csv("dbfs:/FileStore/tables/Sample1-1.txt") // 映射到目标Schema val targetDf = rawDf.toDF("FS1", "FS2", "FS3") // 验证结果 targetDf.printSchema() targetDf.show(false) // 写入带表头的竖线分隔文件 targetDf.write .option("sep", "|") .option("header", "true") .mode("overwrite") .csv("dbfs:/FileStore/tables/File1.txt")
方案2:修复原RDD映射逻辑
如果需要保留原代码结构,仅需修正split的转义写法:
import org.apache.spark.sql.{DataFrame, Dataset} import spark.implicits._ val df = spark.read.text("dbfs:/FileStore/tables/Sample1-1.txt") val dataDf = df.map(row => { // 用双反斜杠转义|,或使用Pattern.quote("|")避免正则元字符影响 val elements = row.getString(0).split("\\|") (elements(0), elements(1), elements(2)) }).toDF("FS1", "FS2", "FS3") dataDf.printSchema() dataDf.show(false) // 输出目标文件 dataDf.write .option("sep", "|") .option("header", "true") .mode("overwrite") .csv("dbfs:/FileStore/tables/File1.txt")
关键说明
- 方案1是Spark官方推荐的处理分隔符文件的方式,内置了对空值、转义字符等场景的处理,比手动拆分更可靠。
- 写入时设置
header: true会自动将列名作为表头写入,sep: "|"确保输出格式为竖线分隔。
内容的提问来源于stack exchange,提问作者Priyam Ghosh Dastidar
相关产品推荐
相关产品推荐

