Spark读取TSV文件设置sep为\t却仅生成单列的问题排查
问题分析与解决方案
你遇到的问题核心是分隔符的类型不匹配,Spark的CSV读取器要求sep参数是字符串类型,但你传递的是Scala的Char类型(单引号包裹的' '),这导致Spark没有正确识别制表符分隔符,所以把整行内容都当成了单列_c0。
为什么原代码不生效?
在Scala中,单引号'xxx'定义的是单个字符(Char类型),而双引号"xxx"定义的是字符串(String类型)。Spark的DataFrameReader.option()方法对于sep参数,需要接收字符串格式的分隔符。虽然Scala会自动将Char隐式转换为String,但在处理制表符这类特殊字符时,这种转换会导致Spark无法正确解析分隔规则,最终把所有内容合并到一列。
修正后的代码
只需要把分隔符改成字符串类型的制表符"\t"即可:
val df = spark.read.option("sep", "\t").csv(location)
如果你的TSV文件包含表头,还可以加上header参数让Spark自动识别列名,加上inferSchema自动推断列类型:
val df = spark.read .option("sep", "\t") .option("header", "true") // 若文件有表头则开启 .option("inferSchema", "true") // 自动推断列数据类型,可选 .csv(location)
验证结果
修正后再打印Schema和数据,会得到正确的多列结构:
df.printSchema // root // |-- _c0: string (nullable = true) // |-- _c1: string (nullable = true) // |-- _c2: string (nullable = true) df.show // +---+---+---+ // |_c0|_c1|_c2| // +---+---+---+ // | 3| 1| .1| // | 3| 2| .2| // | 3| 4| .3| // | 2| 1| .4| // | 2| 3| .5| // +---+---+---+
额外提示
你也可以用delimiter参数替代sep,两者是等价的:
spark.read.option("delimiter", "\t").csv(location)
内容的提问来源于stack exchange,提问作者Adair
相关产品推荐
相关产品推荐

