为什么 hive 在联接操作期间不选择 SerDe JAR?



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", "名称":"圆形T恤", "经销商":"耐克", "类别":"上衣", "价格":2195.03, "折扣":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", "取消":"TRUE", "退货":"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":null, "User_id":"U189", "取消":"假", "退货":"假", "Cancellation_reason":"不适用", "Return_reason":"不适用", "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: 阶段-5

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

2018-10-10 12:47:43,984 错误 [主要]: 先生.MapredLocalTask (MapredLocalTask.java:executeInProcess(398(( - Hive 运行时错误:映射本地工作失败 org.apache.hadoop.hive.ql.metadata.HiveException: Failed with exception java.lang.ClassNotFoundException: org.openx.data.jsonserde.JsonSerDejava.lang.RuntimeException:java.lang.ClassNotFoundException: org.openx.data.jsonserde.JsonSerDeat org.apache.hadoop.hive.ql.plan.TableDesc.getDeserializerClass(TableDesc.java:73(

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

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

上一篇文章。

如何在配置单元中添加 JAR 文件

最新更新