如何确定对象是否是 PySpark 中的有效键值对
How to determine if object is a valid key-value pair in PySpark
- 如果我有一个rdd,我怎么理解数据在key:value
格式?有没有办法找到相同的 - 像
type(object) 告诉我一个对象的类型。我试过
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)
作为值,其中 x 和 y 是键?还是键必须是单个值?我注意到,如果我使用 reduceByKey
和 sum
函数来获取数据 ((x,3),(y,4))
那么将此数据定义为键值对 会变得容易得多
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
所以它的类型总是相同的。
- 如果我有一个rdd,我怎么理解数据在key:value
格式?有没有办法找到相同的 - 像
type(object) 告诉我一个对象的类型。我试过
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)
作为值,其中 x 和 y 是键?还是键必须是单个值?我注意到,如果我使用reduceByKey
和sum
函数来获取数据((x,3),(y,4))
那么将此数据定义为键值对 会变得容易得多
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
所以它的类型总是相同的。