使用 PIG 加载 Hive 表的问题

Posted

技术标签:

【中文标题】使用 PIG 加载 Hive 表的问题【英文标题】:Issue for loading Hive table using PIG 【发布时间】:2017-01-25 16:05:47 【问题描述】:

我想使用 PIG 连接 3 个表,然后加载到 Hive 表中。在存储数据之前,我可以使用转储在屏幕中显示数据。我使用下面的命令来存储数据,它失败了。

store jnr_mas_ins INTO 'table_name' USING org.apache.hive.hcatalog.pig.HCatStorer();

错误是:

2017-01-25 10:58:48,487 [main] ERROR org.apache.pig.tools.grunt.Grunt - ERROR 1002: Unable to store alias jnr_mas_ins
Details at logfile: /export/home/pig_1485359450881.log

我搜索了这个网站,有人建议使用以下命令:

store jnr_mas_ins INTO 'hdfs://fullpath' USING org.apache.hive.hcatalog.pig.HCatStorer();


001 : Error setting output information. Cause : NoSuchObjectException(message:default.hdfs://fullpath table not found)
Details at logfile: /export/home/pig_1485359450881.log

请您帮忙解决这个问题,在此先感谢 下面是我用来填充表格的脚本。

account_master_ALL = LOAD 'ACCT' USING org.apache.hive.hcatalog.pig.HCatLoader(); account_master_fil = 按 croft_source_sys_cd == ''ABC'' 过滤 account_master_ALL; account_master = foreach account_master_fil 生成acct_master_key,(trans_date为null?'-999':trans_date)为trans_date,(acct_data_1为null?'-999':acct_data_1)为acct_data_1,(acct_data_2为null?'-999':acct_data_2)为acct_data_2,(acct_data_3 为空?'-999':acct_data_3)作为acct_data_3,(acct_data_4 为空?'-999':acct_data_4)作为acct_data_4,(acct_data_5 为空?'-999':acct_data_5)作为acct_data_5,acct_m_ref_key,croft_source_sys_cd ; acct_detail_all = LOAD 'acct_detail_tb' 使用 org.apache.hive.hcatalog.pig.HCatLoader(); acct_detail = foreach acct_detail_all 生成 c_number、b_number、a_number、c_coded、a_type、c_digit、s_number、r_type、r_cd、s_qty、s_b_cost、trade_qty、t_cost、p_date、load_date; jnr_all = 加入 acct_detail by (a_number, b_number, c_coded, a_type, c_number, c_digit), account_master by (acct_data_1, trans_date, acct_data_2, acct_data_3, acct_data_4, acct_data_5); ins_master_all = LOAD 'ins_acct' 使用 org.apache.hive.hcatalog.pig.HCatLoader(); jnr_mas_ins_all = 加入 jnr_all by (acct_detail::s_number), ins_master_all by (acct_data_1); jnr_mas_ins = foreach jnr_mas_ins_all 生成 acct_master_key 作为 acct_master_key,ins_master_key 作为 ins_master_key,'ABC' 作为 code_dev,c_number 作为 c_number,b_number 作为 b_number,a_number 作为 src_a_number,c_coded 作为 c_coded,a_type 作为 a_type,c_digit 作为 c_digit,s_number 作为 s_number,r_type 作为 r_ , r_cd 作为 r_cd, s_qty 作为 s_qty, s_b_cost 作为 s_b_cost, trade_qty 作为 trade_qty, t_cost 作为 t_cost, p_date 作为 p_date, CurrentTime() 作为 load_date, 'PIG_USER' 作为 create_userid, CurrentTime() 作为 create_date, CurrentTime() 作为 f_date; 使用 org.apache.hive.hcatalog.pig.HCatStorer() 存储 jnr_mas_ins INTO 'tartet_table';

【问题讨论】:

发布你的整个 PIG 脚本 感谢 inquisitive_mind,我刚刚通过添加我的脚本更新了第一个流。请看一下。谢谢。 【参考方案1】:

看起来您缺少关系 jnr_mas_ins_all。这是从哪里来的?jnr_mas_ins 将是 emtpy,因为没有关系 jnr_mas_ins_all。应该是 ins_master_all

ins_master_all = LOAD 'ins_acct' USING org.apache.hive.hcatalog.pig.HCatLoader();
jnr_mas_ins = foreach jnr_mas_ins_all generate acct_master_key as acct_master_key, ins_master_key as ins_master_key, 'ABC' as code_dev, c_number as c_number, b_number as b_number, a_number as src_a_number, c_coded as c_coded, a_type as a_type, c_digit as c_digit, s_number as s_number, r_type as r_type, r_cd as r_cd, s_qty as s_qty, s_b_cost as s_b_cost, trade_qty as trade_qty, t_cost as t_cost, p_date as p_date, CurrentTime() as load_date, 'PIG_USER' as create_userid, CurrentTime() as create_date, CurrentTime() as f_date;

【讨论】:

感谢 inquisitive_mind。错过的是 jnr_mas_ins_all = join jnr_all by (acct_detail::s_number), ins_master_all by (acct_data_1); 我更新了脚本,过了脚本我错过了 jnr_mas_ins_all 部分。问题是一样的。非常感谢您的帮助。

以上是关于使用 PIG 加载 Hive 表的问题的主要内容,如果未能解决你的问题,请参考以下文章

如何加载分区到 Hbase 表的 hive orc

转储数据集时将数据从 Hive 加载到 Pig 错误

Hive 或 Pig 动态表

通过 pig 脚本删除 hive 表分区

Pig - 读取存储为 Avro 的 Hive 表

对存储在 Hive 中的数据运行 Pig 查询