python apache-spark pyspark key key-value

python - Cómo determinar si el objeto es un par clave-valor válido en PySpark



apache-spark key (1)

  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''> .
  2. Digamos que tengo datos como (x,1),(x,2),(y,1),(y,3) y uso groupByKey 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 uso reduceByKey y la función de sum 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.