使用 PIG 将数据写入 HIVE 外部表

Posted

技术标签:

【中文标题】使用 PIG 将数据写入 HIVE 外部表【英文标题】:Writing data using PIG to HIVE external table 【发布时间】:2016-12-29 18:09:20 【问题描述】:

我想创建一个外部表并通过 pig 脚本将数据加载到其中。我遵循以下方法:


好的。在 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 架构匹配。


我的问题是,当我第一次创建表时,它正在 hdfs 中创建一个目录,当我尝试使用脚本存储文件时,它会抛出一个错误,提示“文件夹已存在”。看起来猪存储总是写入一个只有特定名称的新目录?

有什么办法可以避免这个问题吗?

还有我们可以在 PIG 中使用 STORE 命令来每次写入特定目录/文件的任何其他属性吗?

谢谢 拉姆

【问题讨论】:

【参考方案1】:

是的,您可以使用HCatalog 来实现您的结果。

记住你必须像这样运行你的 Pig 脚本:

pig -useHCatalog your_pig_script.pig

或者如果您使用的是 grunt shell,那么只需使用:

pig -useHCatalog

接下来是你的 store 命令,用于将你的关系直接存储到 hive 表中:

STORE C INTO 'HIVE_DATABASE.EXTERNAL_TABLE_NAME' USING org.apache.hive.hcatalog.pig.HCatStorer();

【讨论】:

以上是关于使用 PIG 将数据写入 HIVE 外部表的主要内容,如果未能解决你的问题,请参考以下文章

Spark 结构化流写入流到 Hive ORC 分区外部表

hive 内部表和外部表的区别

hive外部表分区

将 hive 外部表更改为同一数据库中的内部表也会从另一个表中删除数据

Hive内部表和外部表的区别

将数据从 HDFS 复制到 Hive 中的外部表时出错