web-dev-qa-db-fra.com

Comment effectuez-vous des jointures de base de deux tables RDD dans Spark en utilisant Python?

Comment effectueriez-vous des jointures de base dans Spark en utilisant python? Dans R, vous pouvez utiliser merg () pour ce faire. Quelle est la syntaxe utilisant python sur spark pour:

  1. Jointure interne
  2. Jointure externe gauche
  3. Cross Join

Avec deux tables (RDD) avec une seule colonne dans chacune qui a une clé commune.

RDD(1):(key,U)
RDD(2):(key,V)

Je pense qu'une jointure interne est quelque chose comme ceci:

rdd1.join(rdd2).map(case (key, u, v) => (key, ls ++ rs));

Est-ce correct? J'ai cherché sur Internet et je ne trouve pas un bon exemple de jointures. Merci d'avance.

16
invoketheshell

Cela peut être fait en utilisant PairRDDFunctions ou Spark Data Frames. Comme les opérations sur les trames de données bénéficient de Catalyst Optimizer la deuxième option mérite d'être envisagée.

En supposant que vos données se présentent comme suit:

rdd1 =  sc.parallelize([("foo", 1), ("bar", 2), ("baz", 3)])
rdd2 =  sc.parallelize([("foo", 4), ("bar", 5), ("bar", 6)])

Avec PairRDD:

Jointure interne:

rdd1.join(rdd2)

Jointure externe gauche:

rdd1.leftOuterJoin(rdd2)

Produit cartésien (ne nécessite pas RDD[(T, U)]):

rdd1.cartesian(rdd2)

Jointure de diffusion (ne nécessite pas RDD[(T, U)]):

Enfin, il y a cogroup qui n'a pas d'équivalent SQL direct mais peut être utile dans certaines situations:

cogrouped = rdd1.cogroup(rdd2)

cogrouped.mapValues(lambda x: (list(x[0]), list(x[1]))).collect()
## [('foo', ([1], [4])), ('bar', ([2], [5, 6])), ('baz', ([3], []))]

Avec Spark Data Frames

Vous pouvez utiliser SQL DSL ou exécuter du SQL brut à l'aide de sqlContext.sql.

df1 = spark.createDataFrame(rdd1, ('k', 'v1'))
df2 = spark.createDataFrame(rdd2, ('k', 'v2'))

# Register temporary tables to be able to use sqlContext.sql
df1.createTempView('df1')
df2.createTempView('df2')

Jointure interne:

# inner is a default value so it could be omitted
df1.join(df2, df1.k == df2.k, how='inner') 
spark.sql('SELECT * FROM df1 JOIN df2 ON df1.k = df2.k')

Jointure externe gauche:

df1.join(df2, df1.k == df2.k, how='left_outer')
spark.sql('SELECT * FROM df1 LEFT OUTER JOIN df2 ON df1.k = df2.k')

Jointure croisée (une jointure croisée explicite ou des modifications de configuration sont requises dans Spark. 2.0 - spark.sql.crossJoin.enabled pour Spark 2.x ):

df1.crossJoin(df2)
spark.sql('SELECT * FROM df1 CROSS JOIN df2')
df1.join(df2)
sqlContext.sql('SELECT * FROM df JOIN df2')

Depuis 1.6 (1.5 en Scala) chacun de ceux-ci peut être combiné avec la fonction broadcast:

from pyspark.sql.functions import broadcast

df1.join(broadcast(df2), df1.k == df2.k)

pour effectuer une jointure de diffusion. Voir aussi Pourquoi mon BroadcastHashJoin est plus lent que ShuffledHashJoin dans Spark

34
zero323