在单个实例中将 pig 输出存储到 Hive 表中

Posted

技术标签:

【中文标题】在单个实例中将 pig 输出存储到 Hive 表中【英文标题】:storing pig output into Hive table in a single instance 【发布时间】:2015-07-08 09:30:33 【问题描述】:

我想将 pig 输出插入 Hive 表(Hive 中的表已经使用确切的模式创建)。只需将输出值插入表中。我不想使用通常的方法,其中我首先存储到一个文件中,然后从 Hive 读取该文件,然后插入到表中。我需要减少已完成的额外跳数。

有没有可能。如果是这样,请告诉我如何做到这一点?

谢谢

【问题讨论】:

【参考方案1】:

好的。在 HDFS 目录中的某处创建具有架构布局的外部配置单元表。让我们说

create external table emp_records(id int,
                                  name String,
                                  city String)
                                  row formatted delimited 
                                  fields terminated by '|'
                                  location '/user/cloudera/outputfiles/usecase1';

只需像上面那样创建一个表,无需将任何文件加载到该目录中。

现在编写一个 Pig 脚本,我们读取某个输入目录的数据,然后当您存储该 Pig 脚本的输出时,如下所示使用

A =  LOAD 'inputfile.txt' USING PigStorage(',') AS(id:int,name:chararray,city:chararray);
B = FILTER A by id > = 678933;
C = FOREACH B GENERATE id,name,city;
STORE C INTO '/user/cloudera/outputfiles/usecase1' USING PigStorage('|');

确保 Pigscript 中最终 FOREACH 语句的目标位置、分隔符和架构布局与 Hive DDL 架构匹配。

【讨论】:

感谢您的回复。但这又导致了两个作品,对吧?我的意思是在运行 PIG 之后,我将不得不再次在 Hive 中运行加载命令。我想要类似的东西,比如当我在 PIG 中编写存储命令时,它应该直接存储在 HIVE 表中,而不是任何文件中。 Ok.. 然后请寻找 HCatStorer() ... 使用 org.apache.hcatalog.pig.HCatStorer() 将 C 存储到 'tablename' 中;但为此,您需要在相应的类路径中包含所有需要的 Hcatlog jar 好吧,让我试试看。感谢您的帮助!【参考方案2】:

下面以“Employee”表示例说明了两种方法,将猪的输出存储到 hive 表中。 (前提是hive表应该已经创建)

A =  LOAD 'EMPLOYEE.txt' USING PigStorage(',') AS(EMP_NUM:int,EMP_NAME:chararray,EMP_PHONE:int);

方法一:使用 Hcatalog

// dump pig result to Hive using Hcatalog 
store A into 'Empdb.employee' using org.apache.hive.hcatalog.pig.HCatStorer();

(或)

方法 2:使用 HDFS 物理位置

// dump pig result to external hive warehouse location
STORE A INTO 'hdfs://<<nmhost>>:<<port>>/user/hive/warehouse/Empdb/employee/' USING PigStorage(',')

;

【讨论】:

【参考方案3】:

您可以使用 Hcatalog 存储它

STORE D INTO 'tablename' USING org.apache.hive.hcatalog.pig.HCatStorer();

见下面的链接 https://acadgild.com/blog/loading-and-storing-hive-data-into-pig

【讨论】:

【参考方案4】:

最好的办法是使用HCatalog,将数据写入hive表中。

STORE final_data INTO 'Hive_table_name' 使用 org.apache.hive.hcatalog.pig.HCatStorer();

但在存储数据之前,请确保“final_data”数据集中的列与表的架构完美匹配并映射。

然后像这样运行你的猪脚本: 猪脚本.pig -useHCatalog

【讨论】:

以上是关于在单个实例中将 pig 输出存储到 Hive 表中的主要内容,如果未能解决你的问题,请参考以下文章

在 Pig 中将输出存储到 CSV 文件

解析 XML 并存储在 Hive 表中

使用 PIG 加载 Hive 表的问题

如何在 apache pig 中将列添加到已经存在的表中

如何在 Hive 中将一列拆分为两列

在 Pig 中将多个地图组合在一起