将数据从hive表获取到spark并在RDD上执行连接

时间:2014-11-06 17:29:29

标签: scala apache-spark rdd apache-spark-sql

我在hive / impala中有两个表。我想将表中的数据作为rdds提取到spark中,然后执行连接操作。

我不想直接在我的hive上下文中传递连接查询。这只是一个例子。 我有更多标准HiveQL无法实现的用例。 如何获取所有行,访问列并执行转换。

假设我有两个rdds:

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

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

我想在名为“account_id”

的列上对rdds执行连接

理想情况下,我想使用使用spark shell的rdds来做这样的事情。

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

4 个答案:

答案 0 :(得分:2)

我不确定我是否理解这个问题,但作为替代方案,您可以使用API​​来加入DataFrame,因此您可以通过编程方式确定许多内容(例如,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)

DataFrame API中有许多常见的转换: http://spark.apache.org/docs/latest/api/scala/index.html#org.apache.spark.sql.DataFrame

干杯

答案 1 :(得分:1)

因此我们可以将table1和table2注册为临时表,然后在这些临时表上进行连接。

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

答案 2 :(得分: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-6608https://spark.apache.org/docs/latest/api/scala/index.html#org.apache.spark.sql.DataFrame

答案 3 :(得分:0)

您可以从以下代码中直接选择所需的列:

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