web-dev-qa-db-ja.com

Pythonを使用してSparkで2つのRDDテーブルの基本結合を実行するにはどうすればよいですか?

Pythonを使用してSparkで基本的な結合をどのように実行しますか? Rでは、merg()を使用してこれを行うことができます。 pythonでsparkを使用する構文は次のとおりです。

  1. 内部結合
  2. 左外部結合
  3. クロス結合

共通キーを持つ各列に1つの列を持つ2つのテーブル(RDD)。

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

内部結合は次のようなものだと思います。

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

そうですか?インターネットを検索しましたが、参加の良い例が見つかりません。前もって感謝します。

16
invoketheshell

PairRDDFunctionsまたはSparkデータフレーム。データフレーム操作は Catalyst Optimizer の恩恵を受けるため、2番目のオプションは検討する価値があります。

データが次のようになっていると仮定します。

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

PairRDDの場合:

内部結合:

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

With Spark= Data Frames

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よりも遅い理由 も参照してください。

34
zero323