为什么hive在join操作期间不选择serde jar?

qpgpyjmq  于 2021-06-27  发布在  Hive
关注(0)|答案(1)|浏览(439)

hadoop版本:hadoop 2.6.0-cdh5.12.2 hive版本:hive 1.1.0-cdh5.12.2
由两个表组成:products-stores product id和其他有关产品活动的详细信息-stores user\u id,product\u id,它告诉哪些用户购买了哪些产品和其他交易详细信息。
在创建这些表之前,我使用以下命令添加了serdejar:addjar/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/productsmergenrichout中的示例数据
{“id”:“p101”,“name”:“round tee”,“reseller”:“nike”,“category”:“上衣”,“价格”:2195.03,“折扣”:21.09,“利润百分比”:23.47}
{“id”:“p102”,“name”:“half shift”,“reseller”:“nike”,“category”:“上衣”,“价格”:1563.84,“折扣”:23.83,“利润百分比”: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\u id”:“p117”,“user\u id”:“u148”,“cancellation”:“true”,“return”:“na”,“cancellation\u reason”:“duplicate product”,“return\u reason”:“na”,“order\u date”:“2016-02-12”,“shipping\u date”:“na”,“delivery\u date”:“na”,“cancellation\u date”:“2018-05-20”,“return\u date”:“na”}
{“product\u id”:null,“user\u id”:“u189”,“cancellation”:“false”,“return”:“false”,“cancellation\u reason”:“na”,“return\u reason”:“na”,“order\u date”:“2017-04-22”,“shipping\u date”:“2017-05-05”,“delivery\u date”:“2017-09-09”,“cancellation\u date”:“na”,“return\u date”:“na”}
表创建成功,

select * from products;

&

select * from activity;

查询工作得非常好,因此表示serdejar是在select查询期间被选中的。
但是,当我在下面运行joinquery时:我想将这两个表连接到一个公共列上,该列是productid

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

它失败并显示以下消息
执行日志位于:/tmp/manojkumarm\u r/manojkumarm\u r\u 20181010124747\u 690490ae-e59f-4e9d-9159-5c6a6e28b951.log 2018-10-10 12:47:43开始启动本地任务以处理map join;最大内存=2058354688执行失败,退出状态:2获取错误信息
任务失败!任务id:阶段5
登录/tmp/manojkumarm\u r/manojkumarm\u r\u 20181010124747\u 690490ae-e59f-4e9d-9159-5c6a6e28b951.log
2018-10-10 12:47:43,984错误[main]:mr.mapredlocaltask(mapredlocaltask。java:executeinprocess(398))-配置单元运行时错误:Map本地工作失败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无法找到jsonserdejar,即使我在hive会话期间添加了jar,selct查询也可以正常工作。如果有人解决了类似的问题,请让我知道,我不知道如果Hive在不同的目录中寻找jar在加入操作。

jaxagkaj

jaxagkaj1#

hive不会对所有的“select*”查询调用mr jobs。在您的例子中,当调用实际的mr作业(join query)时,jar文件不会跨集群传播。因此,我建议您重新检查jar文件夹/文件权限,或者将文件移动到hive库路径,并更新hive-site.xml。前面有几篇关于如何添加hivejar文件的文章,您也可以检查一下。
以前的职位。
如何在配置单元中添加jar文件

相关问题