PySpark如何读取使用自定义行分隔符\x03的CSV文件
问题原因&解决方法
你原来的写法本身是PySpark读取自定义行分隔符CSV的标准写法,未生效通常是以下几个原因导致,对应调整即可:
- 首先确认你的PySpark版本,
lineSep参数仅在PySpark 2.2及以上版本可用,低于该版本的环境无法识别这个配置项。 - 处理不可见字符的转义问题:
\x03是ASCII控制字符(文本结束符ETX),Python代码中要使用原始字符串避免转义被吞,把lineSep的取值改成raw字符串格式:
df = spark.read.option("lineSep", r"\x03").csv(path) # 如果需要带表头、指定列类型等,同步补充对应option即可,例如: # df = spark.read.option("lineSep", r"\x03").option("header", True).csv(path) display(df)
- 如果是读取存放在HDFS等分布式存储上的大文件,需要确认文件的实际行分隔符确实是
\x03,可以先用text格式读取前几行校验分隔符:
# 读取前10行原始文本,打印二进制内容确认分隔符 spark.read.text(path).limit(10).collect()
如果确认分隔符是\x03,但上述方案还是不生效,可以先以text格式读取所有内容,用split方法手动拆分后再转成DataFrame结构,作为兼容方案:
from pyspark.sql.functions import split, explode # 读取所有文本,按\x03拆分每行,再展开为行结构 raw_df = spark.read.text(path) split_df = raw_df.select(explode(split(raw_df.value, r"\x03")).alias("line")) # 再按CSV的列分隔符拆分line字段为对应列即可,例如列分隔符是逗号的情况: csv_df = split_df.select(split(split_df.line, ",").alias("cols")).selectExpr("cols[0] as col1", "cols[1] as col2") display(csv_df)
内容的提问来源于stack exchange,提问作者Jack
相关产品推荐
相关产品推荐

