Apache Pig 中的 HCatalog 可以只加载特定分区吗?

Posted

技术标签:

【中文标题】Apache Pig 中的 HCatalog 可以只加载特定分区吗?【英文标题】:Can HCatalog in Apache Pig just load a specific partition? 【发布时间】:2014-05-06 22:41:59 【问题描述】:

我需要在 Pig 中加载某个分区(日期)的数据。此数据是在 Hive 中创建的,并按日期进行分区。所以我想通过 HCatalog 在 Pig 中加载数据。

HCatalog 文档说要在 Pig 中加载某个分区,首先要加载整个数据集,然后对其进行过滤,即:

a = load 'web_logs' using org.apache.hcatalog.pig.HCatLoader();
b = filter a by datestamp > '20110924';

https://cwiki.apache.org/confluence/display/Hive/HCatalog+LoadStore 但恐怕这首先将 整个 数据加载到包 a 中,然后只在 b 中过滤。 我是对还是错?

在 Hive 中这有效(没有 HCat),您可以修剪数据以获得您想要的分区,即:

LOAD DATA  INPATH 'filepath' INTO TABLE tablename [PARTITION (partcol1=val1, partcol2=val2 ...)]

在带有 HCatalog 的 Pig 中这个构造的等价物是什么?

谢谢!

【问题讨论】:

【参考方案1】:

我看到你的问题有两个部分。

第 1 部分,https://cwiki.apache.org/confluence/display/Hive/HCatalog+LoadStore 但恐怕这首先将整个数据加载到包 a 中,然后仅将其过滤到 b 中。我说的对吗?

Ans 1) 否,当您在 load 语句之后应用过滤器时,hcatalog 足够智能以加载您在过滤器语句中指定的指定分区。

第 2 部分) LOAD DATA INPATH 'filepath' INTO TABLE 表名 [PARTITION (partcol1=val1, partcol2=val2 ...)]

在带有 HCatalog 的 Pig 中这个构造的等价物是什么?

Ans 2) 是的,您可以使用 使用 org.apache.hcatalog.pig.HCatStorer('particol1=val1,partcol2=val2') 将 a 存储到 'tablename' 中;

例如: 使用 org.apache.hcatalog.pig.HCatStorer('datestamp=20110924') 将 a 存储到 'tablename' 中;

如果您有任何疑问,请发表评论。

谢谢

【讨论】:

【参考方案2】:

文档指出,如果加载器(使用 HCatLoader())紧跟过滤器,加载器将仅加载指定的分区,而不是加载整个数据集然后过滤掉记录。

来自《编程猪》一书:

"HCatalog 包含加载函数 HCatLoader。HCatLoader 的位置字符串是表的名称。它实现了 LoadMetadata,因此您不需要将模式指定为加载语句的一部分;Pig 将从 HCatLoader 获取它。另外,因为它实现了这个接口,Pig 可以使用 HCatalog 的分区,如果你在加载后立即放置描述要读取哪些分区的过滤器语句,Pig 会将其推送到加载中,以便 HCatalog 只返回相关的分区。 "

这本书非常好,目前在此处作为开源材料提供:http://chimera.labs.oreilly.com/books/1234000001811/ch12.html#cassandra

【讨论】:

以上是关于Apache Pig 中的 HCatalog 可以只加载特定分区吗?的主要内容,如果未能解决你的问题,请参考以下文章

在 Pig 中使用 Hcatalog 加载配置单元表时出错

从 Pig 保存到 Hive 表的问题

如何在 PIG 中进行 DIFF

猪没有使用 Hcatalog 定位 Hive 表

类型转换的问题 - Pig -> HCatalog

从 PIG 中的 SUM 中获取 MAX