我在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;
答案 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。可以使用:
将它们转换为rddlazy val table1_rdd = table1.rdd
lazy val table2_rdd = table2.rdd
这应该是诀窍。在这些rdd上你可以使用任何rdd操作。
另请参阅:https://issues.apache.org/jira/browse/SPARK-6608和https://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)