已解决:pyspark写入文件后丢失字节

wfveoks0  于 2022-12-17  发布在  Spark
关注(0)|答案(1)|浏览(147)

我正在尝试使用pyspark加载一个文本文件,对它进行排序,然后将排序后的数据写入另一个文本文件。
我有一个简单的脚本,可以正确地读入数据,按键排序,然后将其写入输出文件。

#!/usr/bin/python3
import sys
from pyspark.sql import SparkSession

if len(sys.argv) != 5:
    print("Usage: ./sorter.py -i [input filename] -o [output filename]")
    sys.exit(1)

input_filename = sys.argv[2]

output_filename = sys.argv[4]

spark = SparkSession.builder \
                    .master("local[*]") \
                    .appName("sorter") \
                    .getOrCreate()

input_rdd = spark.sparkContext.textFile(input_filename)

print("# partitions: {}".format(input_rdd.getNumPartitions()))

sorted_list = input_rdd.map(lambda x: (x[:10], x[:])) \
                        .sortByKey() \
                        .collect()

with open(output_filename, "w") as ofile:
    for line in sorted_list:
        ofile.write(line[1] + '\n')

输出文件看起来排序正确。但是,输入是使用gensort生成的,输出是使用valsort验证的,并且当运行./valsort output_file时,我的计算机输出

sump pump fatal error: pfunc_get_rec: partial record of 90 bytes found at end of input

我手动创建了一个正确的输出文件,当我将其与pysark生成的输出文件进行比较时,它发现与vimdiff没有差异,当我运行diff并输出时,它认为文件完全不同

output/spark_output.txt output/correct_output.txt differ: byte 99, line 1

当我对它们运行cmp

0md85ypi

0md85ypi1#

编辑:已解决。基因排序在每行末尾附加一个回车符(也称为“\r”和^M),但在读入输入文件时,不知何故,这些回车符没有被捕获。

ofile.write(line[1] + '\r\n')

相关问题