2014-11-06 43 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) 
相关问题