Python中的Spark使用元组 - 如何在加入两个RDD后合并两个元组

时间:2017-01-23 01:04:42

标签: python apache-spark pyspark cloudera bigdata

我在Spark环境与开发方面有点新鲜。

我有两个RDD,我通过一个木匠合并,该木匠的结果如下:

(u'10611', ((u'Laura', u'Mcgee'), (u'66821', u'COMPLETE')))
(u'4026', ((u'Mary', u'Smith'), (u'3237', u'COMPLETE')))
(u'4026', ((u'Mary', u'Smith'), (u'4847', u'CLOSED')))

如果你看到我有两个元组和一个键,我想合并两个元组并将其保留为键和一个元组,如下所示:

(u'10611', (u'Laura', u'Mcgee', u'66821', u'COMPLETE'))
(u'4026', (u'Mary', u'Smith', u'3237', u'COMPLETE'))
(u'4026', (u'Mary', u'Smith', u'4847', u'CLOSED'))

另外,如何在由DFP分隔的saveAsTextFile之前格式化此格式。实施例

10611   Laura   Mcgee   66821   COMPLETE
4026    Mary    Smith   3237    COMPLETE
4026    Mary    Smith   4847    CLOSED

我有类似的东西,但不知道如何使用元组访问它:

.map(lambda x: "%s\t%s\t%s\t%s" %(x[0], x[1], x[2], x[3]))

2 个答案:

答案 0 :(得分:2)

假设您的数据格式一致,您可以将元组与一个简单的加法运算符合并......

>>> weird = (u'10611', ((u'Laura', u'Mcgee'), (u'66821', u'COMPLETE')))
>>> weirdMerged = (weird[0], (weird[1][0]+weird[1][1]))
>>> weirdMerged
(u'10611', (u'Laura', u'Mcgee', u'66821', u'COMPLETE'))

输出到文本应该很简单,但是你的古怪结构使它有点奇怪。你的lambda还不错,但你也可以这样做:

>>> print('\t'.join((weirdMerged[0],)+weirdMerged[1]))
10611   Laura   Mcgee   66821   COMPLETE

我不确定它会好得多,但它确实有用。

答案 1 :(得分:2)

你也可以使用list / tuple comprehension来做这个例子:

my_tuple = (u'10611', ((u'Laura', u'Mcgee'), (u'66821', u'COMPLETE')))
new_tuple = (my_tuple[0], tuple(j for k in my_tuple[1] for j in k))

输出:

print(new_tuple)
>>> ('10611', ('Laura', 'Mcgee', '66821', 'COMPLETE'))

然后,要格式化输出,您也可以这样做:

print("{0}\t{1}" .format(new_tuple[0], "\t".join(k for k in new_tuple[1])))

输出:

>>> 10611   Laura    Mcgee   66821   COMPLETE