是否可以在leftOuterJoin上初始化一个空的默认值?

时间:2016-05-24 19:12:01

标签: python apache-spark pyspark

我有以下两个rdds:

name_to_hour = sc.parallelize([("Amy", [7,8,7,18,19]), ("Dan", [6,7]), ("Emily", [1,2,3,7,7,7,2])])

name_biz = sc.parallelize(["Amy", "Brian", "Chris", "Dan", "Emily"])

我希望加入他们,所以我的rdd看起来像这样:

[('Amy', [7, 8, 7, 18, 19]), ('Chris', []), ('Brian', []), ('Dan', [6, 7]), ('Emily', [1, 2, 3, 7, 7, 7, 2])]

我可以通过我认为笨拙的解决方案实现这一目标:

from pyspark import SparkContext

sc = SparkContext()

name_to_hour = sc.parallelize([("Amy", [7,8,7,18,19]), ("Dan", [6,7]), ("Emily", [1,2,3,7,7,7,2])])

name_biz = sc.parallelize(["Amy", "Brian", "Chris", "Dan", "Emily"])

temp = name_biz.map(lambda x: (x, []))

joined_rdd = temp.leftOuterJoin(name_to_hour)

def concat(my_tup):
    if my_tup[1] is None:
        return []
    else:
        return my_tup[1]

result_rdd = joined_rdd.map(lambda x: (x[0], concat(x[1])))

print "\033[0;34m{}\033[0m".format(result_rdd.collect())

有更好的方法吗?

我在想,如果有可能以某种方式在leftOuterJoin上指定,那么非空字段会保留name_to_hour中的内容并且空白获取默认值[],我的问题可以更轻松地解决,但我不认为有这样的方式。

1 个答案:

答案 0 :(得分:1)

解决此问题的一种方法是利用Python列表的词典排序。因为空列表总是"小于"非空的我们可以简单地制作union并使用max缩小:

temp.union(name_to_hour).reduceByKey(max)

这当然假设密钥是唯一的。