Hive 通过使用预先排序的数据加速蜂巢或清管器聚合

Hive 通过使用预先排序的数据加速蜂巢或清管器聚合,hive,apache-pig,emr,Hive,Apache Pig,Emr,我想在AmazonEMR上加速一个简单的ApacheHive(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

我想在AmazonEMR上加速一个简单的ApacheHive(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;
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);
对于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;
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);
对于猪,我发现
组。。。使用“collected”
应该利用排序,但我得到:

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

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

如果zebra不是hadoop的一部分,首先需要注册
zebra

如果需要构建jar:

  • 获取PIG 12.0的源代码
  • 编译清管器
  • 编译zebra(
    AntZebra

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

  • 其次,据我所知(并尝试过),您无法使用TableLoader以行格式(通常的文本文件)加载数据。数据必须预先使用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;
    

    首先,如果zebra不是hadoop的一部分,您需要注册它

    如果需要构建jar:

  • 获取PIG 12.0的源代码
  • 编译清管器
  • 编译zebra(
    AntZebra

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

  • 其次,据我所知(并尝试过),您无法使用TableLoader以行格式(通常的文本文件)加载数据。数据必须预先使用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;
    

    你能为你的PIG脚本制作一个完整的例子吗?PIG的例子已经差不多完成了,只有一个
    存储被汇总为's3://mybucket/3gram PIG output'在末尾,除了加载阶段,您可以使用zebra TableLoader加载数据。我尝试使用org.apache.hadoop.zebra.pig.TableLoader('ngram,year,counter,pages','sorted')加载's3://mybucket/3gram/'(本地,不在AWS中-当我在AWS中尝试它时,作业失败,但我还没有找到有用的错误消息)你能生成一个完整的PIG脚本示例吗?PIG示例已经差不多完成了,只有一个
    存储汇总为's3://mybucket/3gram PIG output'在末尾,除了加载阶段,您可以使用zebra TableLoader加载数据。我尝试使用org.apache.hadoop.zebra.pig.TableLoader('ngram,year,counter,pages','sorted')加载's3://mybucket/3gram/'(本地,不在AWS中-当我在AWS中尝试它时,作业失败,但我还没有找到有用的错误消息)谢谢,转换步骤正常,但随后我得到
    java.io.IOException:表未排序
    。数据被排序,可能与zebra预期的方式不同。另外,我看到zebra已被弃用(),最初的想法是加速聚合,如果我还有其他步骤要执行,我不确定这是否可行。如果您必须编写和阅读一次,这将不是一个好主意。然而,如果您有一次写入并读取数千次的数据,那么它是有意义的。关于排序问题,只需在存储之前尝试按Ngram排序即可。谢谢,转换步骤很有效,但随后我得到
    java.io.IOException:表未排序
    。数据被排序,可能与zebra预期的方式不同。另外,我看到zebra已被弃用(),最初的想法是加速聚合,如果我还有其他步骤要执行,我不确定这是否可行。如果您必须编写和阅读一次,这将不是一个好主意。然而,如果您有一次写入并读取数千次的数据,那么它是有意义的。关于排序问题,只需在存储之前尝试按Ngram排序即可。