Tengo un par RDD del formato: RDD[(String, String)] y una lista de claves de un archivo. Quiero tener un RDD que contenga solo esos pares clave-valor que coincidan con la clave de la lista. ¿Cómo puedo lograr esto (en Scala, preferiblemente)? Gracias.

1
Raghu 12 ene. 2017 a las 15:21

3 respuestas

La mejor respuesta

Depende de cuántos datos tenga.

Conjunto de datos pequeño (puede ser transmitido)

Use la variable de difusión para enviar la lista a cada ejecutor, luego filtre usando la variable:

val allowedSet = Source.fromFile("filename.txt").getLines.toSet
val allowedBV = sparkContext.broadcast(allowedSet)

val filtered = pairRDD.filter (x => allowedBV.value.contains(x._1))

Gran conjunto de datos

No veo ningún método fácil para unir RDD sin par, pero puede usar Dataset:

val allowedDS = sc.parallelize(allowedSet).toDF("allowedKey").as[String]

Luego, únase a su conjunto de datos con este conjunto de datos:

val joined = pairRDD.toDF("key", "value").join (allowedDS, 'key === 'allowedKey).dropColumn('allowedKey);

Alternativamente, puede hacer cartesiano de estos dos RDD, pero puede ser muy lento

3
T. Gawęda 12 ene. 2017 a las 13:34

En realidad bastante fácil:

import scala.io.Source
val inclusions = Source.fromFile("filename.txt").getLines.toSet

yourRDD.filter(t => inclusions.contains(t._1))

Eso es.

1
Erik Schmiegelow 12 ene. 2017 a las 13:36

Supongo que puedes usar RDD.filter:

rdd.filter(yourKeysList.contains(_._1))

Aquí hay algunos ejemplos más descriptivos para realizar la filtración con Scala o Python

4
solar 12 ene. 2017 a las 13:21