如何确定对象是否是 PySpark 中的有效键值对

How to determine if object is a valid key-value pair in PySpark

  1. 如果我有一个rdd,我怎么理解数据在key:value 格式?有没有办法找到相同的 - 像 type(object) 告诉我一个对象的类型。我试过 print type(rdd.take(1)),但它只显示 <type 'list'>
  2. 假设我有一个像 (x,1),(x,2),(y,1),(y,3) 这样的数据,我使用 groupByKey 得到了 (x,(1,2)),(y,(1,3))。有没有办法定义 (1,2)(1,3) 作为值,其中 x 和 y 是键?还是键必须是单个值?我注意到,如果我使用 reduceByKeysum 函数来获取数据 ((x,3),(y,4)) 那么将此数据定义为键值对
  3. 会变得容易得多

Python 是一种动态类型语言,PySpark 不对键值对使用任何特殊类型。对象被视为 PairRDD 操作的有效数据的唯一要求是它可以按如下方式解包:

k, v = kv

由于语义(固定大小的不可变对象)和与 Scala Product classes 的相似性,通常您会使用两个元素 tuple。但这只是一个惯例,没有什么能阻止你这样做:

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)]

并使任意 class 表现得像 键值 。因此,如果某些东西可以正确地解包为一对对象,那么它就是一个有效的 key-value。实施 __len____getitem__ 魔术方法也应该有效。可能最优雅的处理方式是使用 namedtuples.

还有 type(rdd.take(1)) returns 一个 list 的长度 n 所以它的类型总是相同的。