PySpark saveAsTextFile 写入的内容与 python Write 写入的内容不同
Posted
技术标签:
【中文标题】PySpark saveAsTextFile 写入的内容与 python Write 写入的内容不同【英文标题】:Content written by PySpark saveAsTextFile is different from what was written by python Write 【发布时间】:2019-04-08 17:32:15 【问题描述】:我用pyspark写binary文件,但是内容和python写操作写的不一样。
pyspark saveAsTextFile:
rdd = sc.textFile(gidgid_output_dir+"/part-00000.snappy")\
.map(lambda x: json.loads(x))\
.map(lambda x:pack_data(x))\
.filter(lambda x: x!=None)
rdd.saveAsTextFile(train_output_dir)
输出:
^@^@^@^@^@^@^@^@*^A^@^@^@^@^@^@�^A�̆^Of$n????�^N�;�T����6���<P=�s<8e>��X�w�^Pi5^N7MP�`Z,��qh�^^�!^P^ATD�K^R�E^�O<83>�/'��F¸z��6���^?�r^X�&���-C�^Zj����<P=�3�T����6=�^Pi5^N7M^P�`Z,��q(�^^�!^P^AT^D�q�C$^Q[�^@?��;^G��^@d^E�E�5#���>
用python写:
rdd = sc.textFile(gidgid_output_dir+"/part-00000.snappy")\
.map(lambda x: json.loads(x))\
.map(lambda x:pack_data(x))\
.filter(lambda x: x!=None)\
.collect()
s = "".join(rdd)
with open("out.txt", "w") as ofile:
ofile.write(s)
输出:
^@^@^@^@^@^@^@^@*^A^@^@^@^@^@^@è^A<82>Ì<86>^Of$nò<89>´¡<94>^NÓ;ÂT<8b><85>ý<80>6Âùæ<P=<8f>sÂ<8e><80><96>Xî<89>wÂ^Pi5^N7MPÂ`Z,<92>¬qhÂ^^ä!^P^ATDÂK^RE^ÒOÂ<83>Ð/'»ºF¸z§¬6°<82>Â^?<8c>r^X<98>&ÂÓ-Cì^Zj<8b>Âùæ<P=<8f>3ÅT<8b><85>ý<80
相同的输入数据,但不同的结果,这似乎是一个编码问题。如何使通过saveAsTextFile写入的内容与python write写入的内容一致。
python写的内容是我的情况想要的,我需要spark并行处理数据,我的数据太大,python写操作无法收集和写入。
【问题讨论】:
Why you shouldn't upload pictures of code/data when asking a question。 How to create good reproducible spark dataframe examples 这个post可能是相关的。 【参考方案1】:Python 将数据写入单个文件,而 pyspark saveAsTextFile 将数据写入单独的部分文件,其中部分文件的数量将直接等于 spark执行人。
简单地说,Spark 涉及分布式存储和分布式(并行)处理。 Python 不是。
但是,编写分发的文件并没有什么坏处,因为它确实是一种有效的处理方式,因此与原始 python 相比提高了速度。
如果你想合并部分文件,你可以使用$ cat * > merged-file
或getmerge
命令在HDFS的情况下。
【讨论】:
谢谢。但这不是问题。二进制内容不一样,看附图,好像是编码问题。原始数据相同,但结果不同。以上是关于PySpark saveAsTextFile 写入的内容与 python Write 写入的内容不同的主要内容,如果未能解决你的问题,请参考以下文章
更改 Pyspark rdd 中 saveAsTextFile 选项中的分隔符
Spark saveAsTextFile写入空文件 - _ $ folder $到S3
Spark saveAsTextFile 将空文件 - <directory>_$folder$ 写入 S3