PySpark使用text格式读取竖线分隔TXT文件失败,csv格式可行
问题:PySpark读取竖线分隔TXT文件时text格式无法拆分列,csv格式却可以?
现象复现
使用text格式读取(失败)
指定format('text')读取时,所有数据都被存入单个value列,设置的sep='|'和header=True参数完全不起作用:
df = spark.read.format('text').options(header=True).options(sep='|').load("path\\test.txt") df.show()
输出结果:
+--------------------+ | value| +--------------------+ |Name|Color|Size|O...| |Rabbit|Brown|7|Wa...| | Horse|Green|28|Dock| | Pig|Orange|17|Port| |Cow|Blue|23|Wareh...| | Bird|Yellow|2|Dock| | Dog|Brown|10|Port| |Carrot Man|Orange...| +--------------------+
使用csv格式读取(成功)
即使文件后缀是.txt,指定format('csv')并配置正确的分隔符和表头参数后,数据能被正确拆分到对应列:
df = spark.read.format('csv').options(header=True).options(sep='|').load("path\\test.txt") df.show()
输出结果:
+----------+------+----+---------+ | Name| Color|Size| Origin| +----------+------+----+---------+ | Rabbit| Brown| 7|Warehouse| | Horse| Green| 28| Dock| | Pig|Orange| 17| Port| | Cow| Blue| 23|Warehouse| | Bird|Yellow| 2| Dock| | Dog| Brown| 10| Port| |Carrot Man|Orange| 22|Warehouse| +----------+------+----+---------+
原因解析
text数据源的本质:它的设计目标是读取纯文本行,每一行只会被解析为单个value字段,不支持任何分隔符拆分或表头解析的配置,所以你设置的sep和header参数对它没有任何效果。csv数据源的适配性:它是专门用于处理分隔符分隔的结构化文本的,不管文件后缀是什么,只要内容符合分隔格式,就能通过sep指定分隔符,header=True识别第一行为表头,从而正确解析出多列数据。
结论
处理竖线(或其他分隔符)分隔的结构化文本文件时,无论文件后缀是.txt还是.csv,都应该使用csv格式读取,而非text格式。
内容的提问来源于stack exchange,提问作者OhMoh24
相关产品推荐
相关产品推荐

