print type(rdd.take(1))
<type 'list'>
(x,1),(x,2),(y,1),(y,3)
groupByKey
(x,(1,2)),(y,(1,3))
(1,2)
(1,3)
reduceByKey
sum
((x,3),(y,4))
Python是一种动态类型化的语言,PySpark对键,值对不使用任何特殊类型。将对象视为PairRDD操作的有效数据的唯一要求是可以按以下方式解压缩对象:
PairRDD
k, v = kv
通常,tuple由于其语义(固定大小的不可变对象)和与ScalaProduct类的相似性,您将使用两个元素。但这只是一个约定,没有什么可以阻止您执行以下操作:
tuple
Product
key_value.py
class KeyValue(object): def __init__(self, k, v): self.k = k self.v = v def __iter__(self): for x in [self.k, self.v]: yield x from key_value import KeyValue rdd = sc.parallelize( [KeyValue("foo", 1), KeyValue("foo", 2), KeyValue("bar", 0)]) rdd.reduceByKey(add).collect() ## [('bar', 0), ('foo', 3)]
并使任意类的行为类似于 键值 。因此,如果可以将某事物正确地解压缩为一对对象,那么它就是有效的 键值 。实现方法__len__和__getitem__魔术方法也应该起作用。处理此问题的最优雅的方法可能是使用namedtuples。
__len__
__getitem__
namedtuples
还type(rdd.take(1))返回一个listlength,n因此其类型将始终相同。
type(rdd.take(1))
list
n