为什么配置单元在Join操作期间不选择SerDe JAR?

时间:2018-10-11 04:46:15

标签: hive hive-serde

hadoop版本:Hadoop 2.6.0-cdh5.12.2 蜂巢版本:蜂巢1.1.0-cdh5.12.2

考虑两个表: 产品-存储产品ID和有关该产品的其他详细信息 活动-存储user_id,product_id,它们告诉哪个用户购买了哪个产品以及其他交易明细。

在创建这些表之前,我使用以下命令添加了SerDe JAR: 添加jar /home/ManojKumarM_R/json-serde-1.3-jar-with-dependencies.jar;

CREATE EXTERNAL TABLE IF NOT EXISTS products (id string,name string,reseller 
string,category string,price Double,discount Double,profit_percent Double) 
ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe' location 
"/user/ManojKumarM_R/ProductsMergeEnrichOut";

/ user / ManojKumarM_R / ProductsMergeEnrichOut中的示例数据

{“ Id”:“ P101”,“名称”:“ Round Tee”,“ Reseller”:“ Nike”,“ Category”:“ Top Wear”,“ Price”:2195.03,“ Discount”:21.09, “ Profit_percent”:23.47}

{“ Id”:“ P102”,“名称”:“半班”,“转销商”:“耐克”,“类别”:“穿戴得体”,“价格”:1563.84,“折扣”:23.83, “ Profit_percent”:17.12}

CREATE EXTERNAL TABLE IF NOT EXISTS activity (product_id string,user_id 
string,cancellation boolean ,return boolean,cancellation_reason 
string,return_reason string, order_date timestamp, shipment_date timestamp, 
delivery_date timestamp , cancellation_date timestamp,  return_date 
timestamp) ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe' location 
"/user/ManojKumarM_R/ActivityMergeEnrichOut/";

/ user / ManojKumarM_R / ActivityMergeEnrichOut /

中的示例数据

{“ Product_id”:“ P117”,“ User_id”:“ U148”,“ Cancellation”:“ TRUE”,“ Return”:“ NA”,“ Cancellation_reason”:“重复产品”,“ Return_reason”:“ NA”,“ Order_date”:“ 2016-02-12”,“ Shipment_date”:“ NA”,“ Delivery_date”:“ NA”,“ Cancellation_date”:“ 2018-05-20”,“ Return_date”:“ NA” }

{“ Product_id”:空,“ User_id”:“ U189”,“ Cancellation”:“ FALSE”,“ Return”:“ FALSE”,“ Cancellation_reason”:“ NA”,“ Return_reason”:“ NA”, “ Order_date”:“ 2017-04-22”,“ Shipment_date”:“ 2017-05-05”,“ Delivery_date”:“ 2017-09-09”,“ Cancellation_date”:“ NA”,“ Return_date”:“ NA “}

表创建成功,

select * from products; 

select * from activity; 

查询工作正常,因此表明在选择查询期间选择了SerDe JAR。

但是,当我在联接查询下面运行时:我想将这两个表联接在一个公共列上,即产品ID

SELECT a.user_id, p.category FROM activity a JOIN products p  
ON(a.product_id = p.Id);

它失败,并显示以下消息

执行日志位于:/tmp/ManojKumarM_R/ManojKumarM_R_20181010124747_690490ae-e59f-4e9d-9159-5c6a6e28b951.log 2018-10-10 12:47:43开始启动本地任务以处理地图联接;最大内存= 2058354688 执行失败,退出状态:2 获取错误信息

任务失败! 任务ID:   第五阶段

登录/tmp/ManojKumarM_R/ManojKumarM_R_20181010124747_690490ae-e59f-4e9d-9159-5c6a6e28b951.log

2018-10-10 12:47:43,984错误[main]:mr.MapredLocalTask​​(MapredLocalTask​​.java:executeInProcess(398))-Hive运行时错误:映射本地工作失败 org.apache.hadoop.hive.ql.metadata.HiveException:失败,异常为java.lang.ClassNotFoundException:org.openx.data.jsonserde.JsonSerDejava.lang.RuntimeException: java.lang.ClassNotFoundException:org.openx。 data.jsonserde.JsonSerDe         在org.apache.hadoop.hive.ql.plan.TableDesc.getDeserializerClass(TableDesc.java:73)

表示Hive无法找到JsonSerDe JAR,即使我在该Hive会话中添加了JAR并且selct查询也可以正常工作。 如果有人解决了类似的问题,请告诉我,不确定Hive在JOIN操作期间是否在不同目录中查找JAR。

1 个答案:

答案 0 :(得分:0)

Hive不会为所有“ SELECT *”查询调用MR作业。在您的情况下,调用实际的MR作业(JOIN查询)时,JAR文件不会在群集之间传播。因此,我建议您重新检查JAR文件夹/文件的权限,或将文件移动到HIVE库路径,并更新Hive-site.xml。关于如何添加HIVE JAR文件,以前有几篇文章,您也可以进行检查。

上一篇文章。

how to add a jar file in hive