Scala 将配置单元表中的数据提取到spark中,并在RDD上执行连接
我在蜂巢/黑斑羚里有两张桌子。我想将表中的数据作为RDD提取到spark中,并执行连接操作 我不想在配置单元上下文中直接传递联接查询。这只是一个例子。 我有更多标准HiveQL无法实现的用例。 如何获取所有行、访问列和执行转换 假设我有两个RDD:Scala 将配置单元表中的数据提取到spark中,并在RDD上执行连接,scala,apache-spark,rdd,apache-spark-sql,Scala,Apache Spark,Rdd,Apache Spark Sql,我在蜂巢/黑斑羚里有两张桌子。我想将表中的数据作为RDD提取到spark中,并执行连接操作 我不想在配置单元上下文中直接传递联接查询。这只是一个例子。 我有更多标准HiveQL无法实现的用例。 如何获取所有行、访问列和执行转换 假设我有两个RDD: val table1 = hiveContext.hql("select * from tem1") val table2 = hiveContext.hql("select * from tem2") 我想在名为“account\u id”
val table1 = hiveContext.hql("select * from tem1")
val table2 = hiveContext.hql("select * from tem2")
我想在名为“account\u id”的列上对RDD执行联接
理想情况下,我希望使用使用spark shell的RDD做类似的事情
select * from tem1 join tem2 on tem1.account_id=tem2.account_id;
因此,我们可以将表1和表2注册为临时表,然后在这些临时表上进行连接
table1.registerTempTable("t1")
table2.registerTempTable("t2")
table3 = hiveContext.hql("select * from t1 join t2 on t1.account_id=t2.account_id")
表1和表2属于DataFrame类型。可以使用以下方法将其转换为rdd:
lazy val table1_rdd = table1.rdd
lazy val table2_rdd = table2.rdd
这应该是关键。在这些rdd上,您可以使用任何rdd操作
另请参见:和我不确定我是否理解了这个问题,但是作为一种替代方法,您可以使用API连接数据帧,这样您就可以通过编程来决定许多事情(例如,
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中有许多常见的转换:
Cheers您可以直接从以下代码中选择所需的列:
val table1 = hiveContext.hql("select account_id from tem1")
val table2 = hiveContext.hql("select account_id from tem2")
val joinedTable = table1.join(table2)
你好,霍顿,谢谢,但我已经说过我不想这样做。这只是一个简单的例子。我有一个用例,其中有更复杂的查询。我希望能够从结果集构造rdd,并执行联接和其他操作。啊,对不起,user1189851,我以为您希望避免在原始配置单元表上执行联接。在上面的代码片段中,我发布了table1和table2可以是任何SchemaRDD(请注意,我们编写的任何查询都会返回SchemaRDDs),您希望table1和table2是什么?您希望它们来自非Spark SQL源吗?因此我有一个例子,其中我的第一个rdd是查询的结果集。第二个是另一个查询的结果集。val rdd1=hiveContext.hql(“从表1中选择*”)和val rdd2.=hql(“从表2中选择*”)。我想在这两个RDD上对一个名为account_id的公共属性执行say join。我不想在配置单元上下文中进行连接,我应该能够使用转换来完成。