2014-11-06 26 views
4

我在hive/impala中有兩個表。我想從表中將數據提取爲spark,並執行聯合操作。從配置單元表中取數據到spark並在RDD上執行連接

我不想直接在我的配置單元上下文中傳遞連接查詢。這只是一個例子。 我有更多的標準HiveQL無法使用的用例。 如何獲取所有行,訪問列並執行轉換。

假設我有兩個RDDS:

val table1 = hiveContext.hql("select * from tem1") 

val table2 = hiveContext.hql("select * from tem2") 

我想執行上一列RDDS稱爲「ACCOUNT_ID」

理想我想要做的使用使用火花RDDS像這樣一個連接貝殼。

select * from tem1 join tem2 on tem1.account_id=tem2.account_id; 

回答

1

因此,我們可以將table1和table2註冊爲臨時表,然後在這些臨時表上執行連接。

table1.registerTempTable("t1") 
table2.registerTempTable("t2") 
table3 = hiveContext.hql("select * from t1 join t2 on t1.account_id=t2.account_id") 
+0

嗨霍爾登,謝謝,但我已經提到,我不想這樣做。這只是一個簡單的例子。我有一個用例,我有更復雜的查詢。我希望能夠從結果集中構建rdd並執行連接和其他操作。 – user1189851 2014-11-06 22:43:00

+1

對不起user1189851,我以爲你想避免在原始的hive表上進行連接。在上面的代碼片段中,我發佈了table1,table2可以是任何SchemaRDD(並且請注意,我們編寫的任何查詢都會讓我們回到SchemaRDD中),您希望table1和table2是什麼?你希望它們來自非Spark SQL源嗎? – Holden 2014-11-06 23:21:23

+0

所以我有我的第一個rdd是查詢的結果集的情況。第二個是另一個查詢的結果集。 val rdd1 = hiveContext.hql(「select * from table1」)和val rdd2。 = hiveContext.hql(「select * from table2」)。我想在這兩個名爲account_id的公共屬性上執行say join。這個想法是我不想要在蜂巢上下文中的連接,我應該能夠使用轉換。 – user1189851 2014-11-07 14:47:47

0

table1和table2是DataFrame類型。有可能將它們轉換成rdd的使用:

lazy val table1_rdd = table1.rdd 
lazy val table2_rdd = table2.rdd 

這應該是訣竅。在這些rdd上你可以使用任何rdd操作。

參見:https://issues.apache.org/jira/browse/SPARK-6608和​​

1

我不知道我理解的問題,但作爲替代,你可以使用API​​來加入DataFrames,所以你可以有很多事情決定編程(如join功能可以作爲參數傳遞給應用自定義轉換的方法)。

對於你的榜樣,它會是這樣:

val table1 = hiveContext.sql("select * from tem1") 
val table2 = hiveContext.sql("select * from tem2") 
val common_attributes = Seq("account_id") 
val joined = table1.join(table2, common_attributes) 

有數據幀API中提供許多常見的轉換: http://spark.apache.org/docs/latest/api/scala/index.html#org.apache.spark.sql.DataFrame

乾杯

0

可以直接選擇該列其中你想從以下代碼:

val table1 = hiveContext.hql("select account_id from tem1") 
val table2 = hiveContext.hql("select account_id from tem2") 
val joinedTable = table1.join(table2) 
相關問題