通过使用预先排序的数据加速hive或pig聚合

esyap4oy  于 2021-06-25  发布在  Pig
关注(0)|答案(1)|浏览(301)

我想在amazonemr上加速一个简单的apachehive(0.13.1)或pig(0.12.0版)聚合作业。我的数据已经按照需要聚合的键进行了排序,我希望作业能够利用这个键。
Hive:

[..some 'set' calls etc...]
CREATE EXTERNAL TABLE ngrams (gram string, year int, occurrences bigint,pages bigint, books bigint)
  ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'
  STORED AS TEXTFILE
  LOCATION 's3://mybucket/3gram/';
INSERT OVERWRITE TABLE s3 select gram, sum(occurrences) from ngrams where year >= 1910 group by gram;

对于hive,我找不到方法告诉它数据已经排序了。
清管器:

ngrams = LOAD 's3://mybucket/3gram/' AS (ngram:chararray, year:int, counter:int, pages:int);
filtered = FILTER ngrams BY year >= 1910;
grouped = GROUP filtered BY (ngram);
summed = FOREACH grouped GENERATE group, SUM(filtered.counter);

对于Pig,我发现了 GROUP ... USING 'collected' 应该利用排序,但我得到:

While using 'collected' on group; data must be loaded via loader implementing CollectableLoadFunc

那么,如何以排序的方式加载数据呢?我找到了 LOAD 以及 USING org.apache.hadoop.zebra.pig.TableLoader() 在网上,但Pig抱怨它不知道这个类。

nfg76nw0

nfg76nw01#

首先你需要 REGISTER 斑马,如果它不是hadoop的一部分。
如果需要构建jar:
获取Pig源12.0
编译清管器
编译斑马( ant zebra )
注册'/yourpath/pig-0.12.0/build/contrib/zebra/zebra-0.8.0-dev.jar';
第二,据我所知(并尝试过),你不能 LOAD 表格加载器的行格式数据(通常的文本文件)。这些数据必须预先存储在tablestorer中,tablestorer将以面向列的格式写入数据,并包含模式。
您可以尝试此操作并检查输出/错误:

ngrams_row = LOAD 's3://mybucket/3gram/' AS (ngram: chararray, year:int, counter: int, pages: int);
STORE ngrams_row INTO 's3://mybucket/3gram-zebra/' using org.apache.hadoop.zebra.pig.TableStorer('[ngram];[year,counter,pages]');
ngrams_zebra = LOAD 's3://mybucket/3gram-zebra/' USING org.apache.hadoop.zebra.pig.TableLoader('ngram,year,counter,pages', 'sorted'); 

DESCRIBE ngrams_zebra;
DUMP ngrams_zebra;

相关问题