1

私は 3 つの SchemaRDD (HDFS の Parquet ファイルに格納された、それぞれが 100 万件のレコードのオーダー) を使用して 3 方向の結合を行っています。

スキーマは次のとおりです。

  • table1 には、id、group_id、t2_id、および日付の 4 つのフィールドがあります。
  • table2 には、id、group_id、および t3_id の 3 つのフィールドがあります。
  • table3 には、id、group_id、date の 3 つのフィールドがあります。

グループ内の table1 と table3 の関係を把握しようとしています。

私が使用する SQL クエリは次のようになります。

SELECT group_id, t1.id, t3.id 
  FROM table1, table2, table3 
  WHERE t1.group_id = t2.group_id and t1.t2_id = t2.id and 
    and t2.group_id = t3.group_id and t2.t3_id = t3.id and
    t3.date < t1.date

しかし、私はSparkでそれをやろうとしています:

val sqlContext = new org.apache.spark.sql.SQLContext(sc)
import sqlContext._
import org.apache.spark.sql.catalyst.plans.{Inner, JoinType}


val tab1 = sqlContext.parquetFile("warehouse/tab1_pq")
val tab2 = sqlContext.parquetFile("warehouse/tab2_pq")
val tab3 = sqlContext.parquetFile("warehouse/tab3_pq")

val relationship = tab1.as('t1).
  join(tab2.as('t2), Inner, Some(("t2.group_id".attr === "t1.group_id".attr) &&  ("t2.id".attr === "t1.t2_id".attr))).
  join(tab3.as('t3), Inner, Some(("t3.group_id".attr === "t2.group_id".attr) &&  ("t3.id".attr === "t2.t3_id".attr))).
  where("t3.date".attr <= "t1.date".attr).
  select("t1.group_id".attr, "t1.id".attr, "t3.id".attr)   

したがって、これは機能しているように見えますが、同じ (3 ユニット、EMR) クラスターで impala よりも実行速度が大幅に遅くなります。これは正しい方法ですか?これをより効率的にする方法はありますか?

助けてくれてありがとう

4

0 に答える 0