下面是我用来在HDFS中编写的python脚本。 RDD是一对RDD。脚本工作正常,但它在HDFS中创建一个条目作为元组。我可以删除元组,只在HDFS中创建逗号分隔的条目。
import sys
from pyspark import SparkContext
if len(sys.argv) < 2:
print 'Insufficient arguments'
sys.exit()
sc = SparkContext()
initialrdd1 = sc.textFile(sys.argv[1])
finalRDD1 = initialrdd1.map(lambda x:x.split(',')).map(lambda x :(x[1],x[0])).sortByKey()
print finalRDD1.getNumPartitions()
finalRDD1.saveAsTextFile('/export_dir/result3/')
以HDFS格式存储的文件格式如下
(u'Alpha', u'E03')
(u'Beta', u'E02')
(u'Gamma', u'E05')
(u'Delta', u'E09')
答案 0 :(得分:1)
为什么不首先将元组映射到字符串然后保存它 -
finalRDD1.map(lambda x: ','.join(str(s) for s in x)).saveAsTextFile('/export_dir/result3/')
答案 1 :(得分:0)
finalRDD1 = initialrdd1.map(lambda x:x.split(',')).map(lambda x :(x[1],x[0])).sortByKey()
了解您的代码。在您的初始RDD中,您将每个条目映射到元组。 map(lambda x:(x [1],x [0]))
finalRDD1.saveAsTextFile('/export_dir/result3/')
在sortByKey操作之后,您直接继续将RDD保存为文本文件。
为了将条目保存为CSV,您必须明确指定它 -
def csv_format(data):
return ','.join(str(d) for d in data)
# Rest of the code ...
finalRDD1.map(csv_format).saveAsTextFile('/export_dir/result3/')
答案 2 :(得分:0)
我有类似的问题。
的问题map(lambda x: ','.join(str(s) for s in x)).saveAsTextFile(....)
是它将保存&#39;加入&#39;作为一个字符串,这将隐藏逗号,如果你打算用于像pandas df这样的加载分析,可能会很头疼。所以你的字符串看起来像这样
[ 'Alpha, E03', 'Beta, E02',....]
简单的解决方案是在saveAsTextFile()
之前插入另一个地图拆分.map(lambda x: x.split(',')).saveAsTextFile(....)
所以最终代码看起来像这样
finalRDD1.map(csv_format).map(lambda x: ','.join(str(s) for s in x)).map(lambda x: x.split(',')).saveAsTextFile('/export_dir/result3/')
现在你的csv看起来像这样
[ 'Alpha', 'E03']
['Beta', 'E02']
.....
.....