在 PySpark 中读取管道分隔文件时如何处理管道字符和转义字符

How to handle Pipe and escape characters while reading pipe delimited files in PySpark

我有一个竖线分隔的文件。如何处理内容中的反斜杠和管道

这是输入

col1|col2|col3|col4   
123|"\|"|""|2020.01.31 12:00:30  
456|"\"|""|2020.01.31 12:00:30  
678|"|"|""|2020.01.31 12:00:30 

我尝试了以下选项

data =  spark.read.format("com.databricks.spark.csv")\
.option("inferSchema", "true")\
.option('header','true')\
.option('delimiter','|')\
.option("quote", '"')\
.option("escape","|")\
.option("escape", "\")\
.option("timestampFormat", "yyyy.mm.dd hh:mm:ss")\
.load('s3://dummybucket/a.csv')

我得到的输出为

col1|col2|col3|col4   
123|"\|"|""|2020-01-31T00:00:30.000Z  
456|"\"|\""|2020-01-31T00:00:30.000Z|""  
678|"|"|""|2020-01-31T00:00:30.000Z

预期输出

col1|col2|col3|col4   
123|"\|"|""|2020-01-31T00:00:30.000Z   
456|"\"|""|2020-01-31T00:00:30.000Z    
678|"|"|""|2020-01-31T00:00:30.000Z   

您已声明 escape 两次。但是,属性 只能为数据集定义一次。您只需要定义一次。

.option("escape","|") \
.option("escape", "\") \
  • 默认情况下,如果未定义 escape 的值将为 \ (link here)。

  • 您已将引号字符定义为 "。转义字符用于转义引号字符。例如,如果引号字符为 " 且转义字符为 \.

    ,则 "show this \"" 将产生 show this "
  • 对于此特定示例,您需要将 escape 更改为控制字符,例如 # 或任何未出现在引号字符之前的值"。因此,您不能使用 |,因为它出现在第 1 行的引号之前。您也不能使用 \,因为它出现在第 2 行的引号之前。

  • 您还必须为 escape 指定一个值,因为默认值为 \。这将为您打破第 2 行。