使用预先排序的数据加速Hive或Pig聚合

时间:2015-06-27 15:26:19

标签: hive apache-pig emr

我希望在Amazon EMR上加速简单的Apache Hive(0.13.1)或Pig(版本0.12.0)聚合作业。我的数据已经按照需要聚合的密钥排序,我希望这些工作能够利用它。

蜂巢:

[..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

那么如何以排序方式加载数据呢?我在网上找到了LOADUSING org.apache.hadoop.zebra.pig.TableLoader()的示例,但是Pig抱怨它并不知道该类。

1 个答案:

答案 0 :(得分:0)

首先,如果它不是hadoop的一部分,你需要REGISTER zebra。

如果你需要建立jar:

  1. 获取PIG 12.0的来源
  2. 编译猪
  3. 编译斑马(ant zebra

    注册' /yourpath/pig-0.12.0/build/contrib/zebra/zebra-0.8.0-dev.jar' ;;

  4. 其次,据我所知(并尝试过),你不能使用TableLoader 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;