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

时间:2014-05-06 22:41:59

标签: apache-pig hcatalog

我需要在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 ...)]

Pig with HCatalog中这个构造的等价物是什么?

谢谢!

2 个答案:

答案 0 :(得分:2)

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

第1部分,https://cwiki.apache.org/confluence/display/Hive/HCatalog+LoadStore但我担心这首先将整个数据加载到包a中,然后仅在b中过滤它。我是对还是不对?

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

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

Pig with HCatalog中这个构造的等价物是什么?

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

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

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

由于

答案 1 :(得分:1)

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

从书"编程猪":

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

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