我正在尝试使用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
时
1条答案
按热度按时间rfbsl7qr1#
Gensort在每行末尾附加一个回车符(也称为
\r
和^M
),但在读入输入文件时不知何故没有捕获这些回车符。使用以下代码可以解决问题: