我不确定在撰写这里的答案和我提出这个问题时这是否发生了变化,但我想插入我的发现,以供我自己和其他遇到同样问题的人将来参考。我正在将 GZIP 压缩的 CSV 文件加载到 Spark 版本 2.4.7 和 python 版本 3.7.4 上的 PySpark DataFrame 中,在 Google 的托管 Spark-As-A-Service 产品(即“Dataproc”)中。如果您想进一步研究规范,则底层 Dataproc 映像版本是 1.5-debian10。
我的问题是如果所有输入仍然是乱码,我无法成功读取 CSV。我可以通过更改文件名的结尾来进行一个小调整,使文件后缀为.gz,然后一切正常。这是重现问题的代码。
# This is a shell script to get a dummy file created with 2 different endings
echo 'foo,bar,baz' > test.csv
gzip test.csv
# So now there are 2 files with 2 endings
cp test.csv.gz test_csv
然后我可以运行 pyspark 作业甚至是交互式 pyspark 会话(如下图所示),然后验证 spark 不会智能地检测文件类型,因为它会查看文件名并根据文件名解释文件类型.
$ pyspark
Python 3.7.4 (default, Aug 13 2019, 20:35:49)
[GCC 7.3.0] :: Anaconda, Inc. on linux
Type "help", "copyright", "credits" or "license" for more information.
Setting default log level to "WARN".
To adjust logging level use sc.setLogLevel(newLevel). For SparkR, use setLogLevel(newLevel).
Welcome to
____ __
/ __/__ ___ _____/ /__
_\ \/ _ \/ _ `/ __/ `_/
/__ / .__/\_,_/_/ /_/\_\ version 2.4.7
/_/
Using Python version 3.7.4 (default, Aug 13 2019 20:35:49)
SparkSession available as 'spark'.
>>> filename_noend = 'test_csv'
>>> filename_end = 'test.csv.gz'
>>> schema = 'field1 string,field2 string,field3 string'
>>> df_noend = spark.read.csv(path=filename_noend, schema=schema, header=False)
>>> df_noend.show()
+--------------------+-------------+------+
| field1| field2|field3|
+--------------------+-------------+------+
���`test.cs...|�*.�+T+
| null|
+--------------------+-------------+------+
>>> df_end = spark.read.csv(path=filename_end, schema=schema, header=False)
>>> df_end.show()
+------+------+------+
|field1|field2|field3|
+------+------+------+
| foo| bar| baz|
+------+------+------+
>>> exit()
遗憾的是,没有办法指定 compression='gzip' 之类的东西。因此,以.gz 结尾保存您的 gzip 压缩文件,您就可以开始了!