我在 Google Dataproc 中有一个工作流模板,它从 Google Cloud Storage 中的 json gzip 压缩文件读取架构,其中包含以下标头(因此符合解压缩转码的条件):
Content-Encoding: gzip
Content-Type: application/json
我添加了以下选项,在 Hadoop 连接器中找到here,以确保我的工作流程接受 gzip 编码文件:
gcloud dataproc workflow-templates set-managed-cluster $WORKFLOW_NAME \
...
--properties=core:fs.gs.inputstream.support.gzip.encoding.enable=true
然后,我使用以下 pyspark 行从我的架构中读取 GCS 文件:
decodedDF = spark.read.schema(globalSchema).option("header", True).json(<list-of-GCS-folders-containing-json-files>)
到目前为止一切顺利:工作流程运行良好,没有错误日志。
但是,我的 pyspark 作业的输出与使用未压缩的 GCS 文件运行完全相同的工作流程时不同。
看起来(虽然我无法确认)它仅处理部分文件内容(根据值的总和大约为数据的 10%),但在检查平均值时看起来是连贯的。更改 json 文件的 gzip 压缩级别也会产生不同的结果。
这怎么可能?如何修复 Dataproc 工作流程模板以获得正确的结果?
问题链接至 此 GitHub 问题。
总结一下线程,基于HTTP header的自动解压
Content-Encoding
与Hadoop文件系统不兼容。
解决方案是从 GCS 文件中删除
Content-Encoding
标头,添加 .gz
后缀并设置 Content-Type: application/gzip
。
改为使用此属性:
spark.hadoop.fs.gs.inputstream.support.gzip.encoding.enable=true