2017-05-30 210 views
0

在我的用例中,我在myRDD.map()函数中使用了hivecontext。我得到的错误是java.lang nullpointerexception。我意识到,在地图逻辑中不可能使用hiveContext。 hivecontext用于将hiveql查询发送到另一个表(conf)。 hiveContext.sql()。查询是这样的如何将HiveQL查询转换为相应的DataFrame操作?

select config_date, filefilter, family, id from mydb.conf where  
id == 178 and config_date < cast("2011-02-04 13:05:41.0" as 
timestamp) and family == "drf" order by config_date desc limit 1 

我决定在驱动程序代码中的地图进程开始之前创建此表的数据帧。并在地图逻辑中执行数据帧操作。基本上,想要通过数据帧进行方法调用,而不是使用hivecontext进行查询。
可能吗?有人可以帮我在这里如何通过数据框复制这个查询?

回答

0

是的,将Hive查询转换为数据集是完全可能的。

您可以只用spark.sql(yourQueryHere)或重写查询以使用Spark SQL的Dataset API。

只需使用spark.read.table("mydb.conf")加载您的Hie表格并进行过滤和排序。

val conf = spark. 
    read. 
    table("mydb.conf"). 
    select("config_date", "filefilter", "family", "id"). 
    ... // you know the rest 

然后,您可以join这个数据集与其他和应用加入改造,将可避免使用hiveContext里面的地图。

+0

感谢您的回复。我有一个主Hive表,我从中创建了一个数据框。对于此表的每一行,都会执行业务逻辑(在地图内)。用行中的一些元素作为输入,业务逻辑联系另一个配置表格来检索更多信息。我不是一个火花专家。我创建了hivecontext.sql(),但失败了。然后,我创建了另一个表的数据框,并在地图处理过程中使用。与相同的错误失败。你建议我使用连接两个数据集并执行连接转换。嗯..我会试试这个。 – Bala