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:
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.
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)])
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], []))]
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