我正在从三个单独的CSV中读取数据到Spark RDD(使用pyspark)。
sc = SparkContext()
rdd_list = []
feattable = ['csv1', 'csv2', 'csv3']
for idx, ftable in enumerate(feattable):
print("Loading data from: %s" % ftable, idx)
thisRdd = sc.textFile('hdfs:' + ftable).mapPartitions(lambda line: read_line_csv(line))
thisRdd = thisRdd.map("some mapping no relevant to question")\
.reduceByKey("some reducing no relevant to question")\
.map("final mapping").persist()
rdd_list.append(thisRdd)
rdd = sc.union(rdd_list).reduceByKey(lambda x,y : x+y)
print(rdd.take(5))
在最终映射期间,为了进行调试,我获得了(user_id, list(len(csv entries per user))
的元组。
我运行一次代码并获取:
Loading data from: csv1 0
Loading data from: csv2 1
Loading data from: csv3 2
[('749003', [[2000], [9081], [100]])]
再次跑步我得到:
...
[('749003', [[9081], [100], [2000]])]
再次:
...
[('749003', [[9081], [2000], [100]])]
所以你可以看到我在最终列表中得到一个随机顺序。我希望最终列表能够反映feattable
的顺序。如何强制union
保留RDD附加到列表的顺序?