从一对RDD

时间:2016-09-27 16:01:35

标签: python apache-spark hdfs pyspark

下面是我用来在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')

3 个答案:

答案 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']
 .....
 .....