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^R­E^Ò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 * &gt; merged-filegetmerge命令在HDFS的情况下。

【讨论】:

谢谢。但这不是问题。二进制内容不一样,看附图,好像是编码问题。原始数据相同,但结果不同。

以上是关于PySpark saveAsTextFile 写入的内容与 python Write 写入的内容不同的主要内容,如果未能解决你的问题,请参考以下文章

更改 Pyspark rdd 中 saveAsTextFile 选项中的分隔符

Spark saveAsTextFile写入空文件 - _ $ folder $到S3

使用拆分列将 RDD 写入 csv

Spark saveAsTextFile 将空文件 - <directory>_$folder$ 写入 S3

Spark 'saveAsTextFile' 到 S3:无法控制带有 'coalesce' 的文件数量

PySpark 重新分区 RDD 元素