Spark:提取压缩密钥而不计算值

时间:2016-08-29 22:58:31

标签: python apache-spark pyspark

Spark有一个zip()函数来组合两个RDD。它还具有将它们再次分开的功能:keys()values()。但令我惊讶的是,如果你只要求keys(),那么两个RDD都是完全计算的,即使这些值不是计算所必需的。

在这个例子中,我创建了(key, value)对的RDD,但后来我只要求输入密钥。为什么要计算值呢?在这种情况下,Spark是否不会尝试简化它的内部DAG?

In [1]: def process_value(val):
   ...:     print "Processing {}".format(val)
   ...:     return 2*val
   ...:

In [2]: k = sc.parallelize(['a','b','c'])

In [3]: v = sc.parallelize([1,2,3]).map(process_value)

In [4]: zipped = k.zip(v)

In [5]: zipped.keys().collect()
Processing 1
Processing 2
Processing 3

Out[5]: ['a', 'b', 'c']

1 个答案:

答案 0 :(得分:2)

如果查看source(至少2.0)键()只是实现为

rdd.map(_._1)

即。返回元组的第一个属性,因此必须完全实例化元组。

如果zip返回RDD[Seq[K, V]]或其他一些惰性数据结构,但这可能有效,但元组不是一个惰性数据结构。

简而言之:不。