Pythonを使用してSparkで基本的な結合をどのように実行しますか? Rでは、merg()を使用してこれを行うことができます。 pythonでsparkを使用する構文は次のとおりです。
共通キーを持つ各列に1つの列を持つ2つのテーブル(RDD)。
RDD(1):(key,U)
RDD(2):(key,V)
内部結合は次のようなものだと思います。
rdd1.join(rdd2).map(case (key, u, v) => (key, ls ++ rs));
そうですか?インターネットを検索しましたが、参加の良い例が見つかりません。前もって感謝します。
PairRDDFunctions
またはSparkデータフレーム。データフレーム操作は Catalyst Optimizer の恩恵を受けるため、2番目のオプションは検討する価値があります。
データが次のようになっていると仮定します。
_rdd1 = sc.parallelize([("foo", 1), ("bar", 2), ("baz", 3)])
rdd2 = sc.parallelize([("foo", 4), ("bar", 5), ("bar", 6)])
_
内部結合:
_rdd1.join(rdd2)
_
左外部結合:
_rdd1.leftOuterJoin(rdd2)
_
デカルト積(RDD[(T, U)]
を必要としません):
_rdd1.cartesian(rdd2)
_
ブロードキャスト参加(RDD[(T, U)]
は必要ありません):
最後にcogroup
があります。これは、直接SQLに相当するものはありませんが、状況によっては役立ちます。
_cogrouped = rdd1.cogroup(rdd2)
cogrouped.mapValues(lambda x: (list(x[0]), list(x[1]))).collect()
## [('foo', ([1], [4])), ('bar', ([2], [5, 6])), ('baz', ([3], []))]
_
SQL DSLを使用するか、_sqlContext.sql
_を使用して生の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')
_
内部結合:
_# 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')
_
左外部結合:
_df1.join(df2, df1.k == df2.k, how='left_outer')
spark.sql('SELECT * FROM df1 LEFT OUTER JOIN df2 ON df1.k = df2.k')
_
クロスジョイン(Spark 2.0では明示的なクロスジョインまたは設定の変更が必要です。- spark.sql.crossJoin.enabled for Spark 2.x ):
_df1.crossJoin(df2)
spark.sql('SELECT * FROM df1 CROSS JOIN df2')
_
_df1.join(df2) sqlContext.sql('SELECT * FROM df JOIN df2')
_
1.6(Scalaでは1.5)以降、これらはそれぞれbroadcast
関数と組み合わせることができます。
_from pyspark.sql.functions import broadcast
df1.join(broadcast(df2), df1.k == df2.k)
_
ブロードキャスト参加を実行します。 SparkのBroadcastHashJoinがShuffledHashJoinよりも遅い理由 も参照してください。