PySpark saveAsTextFile编写的内容与python Write编写的内容不同

时间:2019-04-08 17:32:15

标签: apache-spark pyspark

我正在使用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编写的内容,并且需要火花来并行处理数据,我的数据太大,无法通过python写入操作进行收集和写入

1 个答案:

答案 0 :(得分:0)

Python将数据写入单个文件,而pyspark saveAsTextFile将数据写入单独的零件文件,其中零件文件的数量将直接等于spark执行者。

简单地说,spark涉及分布式存储和分布式(并行)处理。 Python不是。

但是,编写分布式文件并没有害处,因为它实际上也是一种有效的处理方式,因此与原始python相比,提高了速度。

如果要合并零件文件,则在HDFS情况下可以使用$ cat * > merged-filegetmerge命令。