1

我需要在 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 中这个构造的等价物是什么?

谢谢!

4

2 回答 2

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 ...)]

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

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

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

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

谢谢

于 2015-02-27T12:36:15.790 回答
1

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

来自“编程猪”一书:

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

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

于 2014-05-12T14:54:00.770 回答