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 可以只加载特定分区吗?的主要内容,如果未能解决你的问题,请参考以下文章