对存储在Hive中的数据运行Pig查询

时间:2011-04-21 07:50:22

标签: hadoop apache-pig hive

我想知道如何运行以Hive格式存储的Pig查询。我已将Hive配置为存储压缩数据(使用本教程http://wiki.apache.org/hadoop/Hive/CompressedStorage)。

在此之前我曾经使用正常的Pig加载函数和Hive的分隔符(^ A)。但是现在Hive通过压缩将数据存储在序列文件中。使用哪种加载功能?

请注意,不需要像这里提到的那样紧密集成:Using Hive with Pig,只是用于读取Hive生成的压缩序列文件的加载函数。

感谢所有答案。

1 个答案:

答案 0 :(得分:5)

这是我发现的: 如果将数据存储为RCFile,则使用HiveColumnarLoader是有意义的。要使用此方法加载表,您需要先注册一些罐子:

register /srv/pigs/piggybank.jar
register /usr/lib/hive/lib/hive-exec-0.5.0.jar
register /usr/lib/hive/lib/hive-common-0.5.0.jar

a = LOAD '/user/hive/warehouse/table' USING org.apache.pig.piggybank.storage.HiveColumnarLoader('ts int, user_id int, url string');

要从Sequence文件加载数据,您必须使用PiggyBank(如前例所示)。 Piggybank的SequenceFile加载器应该处理压缩文件:

register /srv/pigs/piggybank.jar
DEFINE SequenceFileLoader org.apache.pig.piggybank.storage.SequenceFileLoader();
a = LOAD '/user/hive/warehouse/table' USING SequenceFileLoader AS (int, int);

这不适用于Pig 0.7,因为它无法读取BytesWritable类型并将其强制转换为Pig类型,并且您得到此异常:

2011-07-01 10:30:08,589 WARN org.apache.pig.piggybank.storage.SequenceFileLoader: Unable to translate key class org.apache.hadoop.io.BytesWritable to a Pig datatype
2011-07-01 10:30:08,625 WARN org.apache.hadoop.mapred.Child: Error running child
org.apache.pig.backend.BackendException: ERROR 0: Unable to translate class org.apache.hadoop.io.BytesWritable to a Pig datatype
    at org.apache.pig.piggybank.storage.SequenceFileLoader.setKeyType(SequenceFileLoader.java:78)
    at org.apache.pig.piggybank.storage.SequenceFileLoader.getNext(SequenceFileLoader.java:132)
    at org.apache.pig.backend.hadoop.executionengine.mapReduceLayer.PigRecordReader.nextKeyValue(PigRecordReader.java:142)
    at org.apache.hadoop.mapred.MapTask$NewTrackingRecordReader.nextKeyValue(MapTask.java:448)
    at org.apache.hadoop.mapreduce.MapContext.nextKeyValue(MapContext.java:67)
    at org.apache.hadoop.mapreduce.Mapper.run(Mapper.java:143)
    at org.apache.hadoop.mapred.MapTask.runNewMapper(MapTask.java:639)
    at org.apache.hadoop.mapred.MapTask.run(MapTask.java:315)
    at org.apache.hadoop.mapred.Child$4.run(Child.java:217)
    at java.security.AccessController.doPrivileged(Native Method)
    at javax.security.auth.Subject.doAs(Subject.java:396)
    at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1063)
    at org.apache.hadoop.mapred.Child.main(Child.java:211)

如何编译piggybank在这里描述:Unable to build piggybank -> /home/build/ivy/lib does not exist