加入3个SchemaRDD

时间:2014-12-24 23:30:50

标签: apache-spark apache-spark-sql

我正在与三个SchemaRDD进行三向连接(每个都有一百万条记录,存储在HDFS上的Parquet文件中)。

架构如下:

  • table1有四个字段:id,group_id,t2_id和日期
  • table2有三个字段:id,group_id和t3_id
  • table3有三个字段:id,group_id和date

我正试图找出组内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。这是正确的方法吗?有没有办法让这个更高效?

感谢您的帮助

0 个答案:

没有答案