python - Cómo determinar si el objeto es un par clave-valor válido en PySpark
apache-spark key (1)
-
Si tengo un rdd, ¿cómo entiendo que los datos están en clave: formato de valor?
¿Hay alguna manera de encontrar lo mismo? Algo como type (object) me dice el tipo de un objeto.
Intenté
print type(rdd.take(1))
, pero solo dice<type ''list''>
. -
Digamos que tengo datos como
(x,1),(x,2),(y,1),(y,3)
y usogroupByKey
y obtuve(x,(1,2)),(y,(1,3))
. ¿Hay alguna manera de definir(1,2)
y(1,3)
como valores donde x e y son claves? ¿O una clave tiene que ser un valor único?reduceByKey
que si usoreduceByKey
y la función desum
para obtener los datos((x,3),(y,4))
entonces es mucho más fácil definir estos datos como un par clave-valor
Python es un lenguaje de tipo dinámico y PySpark no usa ningún tipo especial para pares de clave y valor.
El único requisito para que un objeto se considere un dato válido para
PairRDD
operaciones de
PairRDD
es que se puede desempaquetar de la siguiente manera:
k, v = kv
Por lo general, usaría una
tuple
dos elementos debido a su semántica (objeto inmutable de tamaño fijo) y similitud con las clases de
Product
Scala.
Pero esto es solo una convención y nada te detiene de algo como esto:
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)]
y hacer que una clase arbitraria se comporte como una
clave-valor
.
Entonces, una vez más, si algo se puede desempaquetar correctamente como un par de objetos, entonces es un
valor clave
válido.
La implementación de los métodos mágicos
__len__
y
__getitem__
debería funcionar.
Probablemente, la forma más elegante de manejar esto es usar
namedtuples
.
También
type(rdd.take(1))
devuelve una
list
de longitud
n
por lo que su tipo será siempre el mismo.