在使用Spark处理之前预处理压缩文件

时间:2019-07-11 08:56:42

标签: apache-spark sed bigdata

我有一个火花作业,可以处理多个压缩文件。文件是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字符可以解决问题,我提出了以下选择。

  1. 这些作业由Apache Airflow精心安排-我可以在DAG中添加一个额外的上游任务来解压缩文件,使用sed将'CR替换为'',然后在火花作业运行。 (注意文件随后以gzip格式存档,因此需要重新压缩)

  2. 如果可能,请使用HDFS API执行相同的任务。

  3. 如果可能的话,请在使用LF字符分割之前,使用Spark API将CR替换为''。

我知道选项1是可行的,但可能有点麻烦。任何人都可以建议选项2或3是否可行,或者是否存在一些更简单的预处理我的数据的方法。

干杯。

特里

0 个答案:

没有答案