Piggy Bank 是一个Pig使用实例的库, 你通过其中的一个 AvroStorage 类对 HDFS 中的 Avro 数据进行读写。
在本方法中会类似于之前的 Hive 方法,你将会读取一些 股票数据,执行一些简单的聚合,之后再将过滤后的数据存储到 HDFS 中。
在开始之前,将 Avro格式的股票数据加载到 HDFS 目录中:
$ pig REGISTER /usr/local/pig/contrib/piggybank/java/piggybank.jar; REGISTER /usr/local/hadoop/share/hadoop/common/lib/avro-*.jar; REGISTER /usr/local/hadoop/share/hadoop/common/lib/jackson-*.jar; REGISTER /usr/local/hadoop/share/hadoop/common/lib/snappy-*.jar; REGISTER /usr/local/hadoop/share/hadoop/httpfs/tomcat/webapps/ webhdfs/WEB-INF/lib/json-*.jar;
接下来,将股票数据加载到 Pig relation 中,并且使用 Load 和 Describe 运算符来表达 Schema 的细节:
grunt> stocks = LOAD 'stock_pig/' USING org.apache.pig.piggybank.storage.avro.AvroStorage(); grunt> DESCRIBE stocks; records: {symbol: chararray,date: chararray,open: double, high: double,low: double,close: double,volume: int, adjClose: double}
需要注意的是,在 Pig 中你不需要提供Avro schema 的详细信息。这是因为你使用的 Avro 容器格式[container format] 已经将 schema 嵌入到了 header 中。即使你的文件没有嵌入 Schema, AvroStorage 类仍然支持你的数据。但是你需要将 Avro schema 上传到 HDFS (就像在 Hive 中一样) 并且使用 “schema_file” 选项。
更多详细请参考文档[37]:
37 更多 Pig 整个细节,请参考: https://cwiki.apache.org/confluence/display/PIG/AvroStorage.
为了验证 Avro 和 Pig 已经正常一起工作,你可以针对每种股票代码 [stock symbol] 执行一些简单的 聚合/计数运算
grunt> by_symbol = GROUP stocks BY symbol; grunt> symbol_count = foreach by_symbol generate group, COUNT($1); grunt> dump symbol_count; (AAPL,10) (CSCO,10) (GOOG,5) (MSFT,10) (YHOO,10)
下面的示例向你展示了在 Pig 中如何写出 Avro 数据。该例子从Google 输入的数据进行过滤,之后将数据写入到 HDFS 中一个新的目录。该示例使用了 Snappy 来压缩输出数据:
grunt> SET mapred.compress.map.output true; grunt> SET mapred.output.compress true; grunt> SET mapred.output.compression.codec org.apache.hadoop.io.compress.SnappyCodec grunt> SET avro.output.codec snappy; grunt> google_stocks = FILTERstocks BY symbol == 'GOOG'; grunt> STORE google_stocks INTO 'stock_pig_output/' USING org.apache.pig.piggybank.storage.avro.AvroStorage( 'no_schema_check', 'data', 'stock_pig/');
38 Additional resources on AvroStorage are at https://cwiki.apache.org/confluence/display/PIG/AvroStorage.