我有一个火花作业,可以处理多个压缩文件。文件是Windows 1252编码的,每行以CRLF
(即\u000d\u000a
)结尾。
我正在使用以下代码将文件加载到DataFrames
hdfs
.globStatus(pathPattern)
.filter(f => f.isFile)
.map{f => f.getPath.getName -> spark
.read
.option("delimiter", "\u000A")
.option("encoding", "Windows-1252")
.csv(f.getPath.toString)
.map(r => r.getString(0))
}
数据为固定宽度格式,因此我期望行长为x,并且提取0..x-1范围内的各种子字符串
在处理了各种文件之后,我发现偶尔会出现行内CR
字符。结果,行长比x短,我拒绝了行。
设置.option("multiLine", "true")
不能解决问题。
用''代替CR
字符可以解决问题,我提出了以下选择。
这些作业由Apache Airflow精心安排-我可以在DAG中添加一个额外的上游任务来解压缩文件,使用sed将'CR
替换为'',然后在火花作业运行。 (注意文件随后以gzip格式存档,因此需要重新压缩)
如果可能,请使用HDFS API执行相同的任务。
如果可能的话,请在使用LF字符分割之前,使用Spark API将CR
替换为''。
我知道选项1是可行的,但可能有点麻烦。任何人都可以建议选项2或3是否可行,或者是否存在一些更简单的预处理我的数据的方法。
干杯。
特里