您的位置:首页 > 其它

Avro技术应用_4. 在 Pig 中实现对 Avro 数据的读写

2015-11-29 18:23 197 查看
Piggy Bank 是一个Pig使用实例的库, 你通过其中的一个 AvroStorage 类对 HDFS 中的 Avro 数据进行读写。在本方法中会类似于之前的 Hive 方法,你将会读取一些 股票数据,执行一些简单的聚合,之后再将过滤后的数据存储到 HDFS 中。在开始之前,将 Avro格式的股票数据加载到 HDFS 目录中:
$ hadoop fs -put $HIP_HOME/schema schema$ hadoop fs -mkdir stock_pig$ hip hip.ch3.avro.AvroStockFileWrite \--input test-data/stocks.txt \--output stock_pig/stocks.avro在 Pig 中,你首先需要注册 JARs 来保证 AvroStorage 能正常工作。你可能需要将特定路径的 JARs 绑定到你正在使用的 Hadoop 分布式系统。以下代码假设 Apache Hadoop和 Pig 默认安装在 /usr/local 路径下 :
$ 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.codecorg.apache.hadoop.io.compress.SnappyCodecgrunt> 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/');
当把Avro数据写入到HDFS,你需要指定你常用数据的Avro模式。上面的示例使用 data 选项来告诉AvroStorage使用您输入的目录下的嵌入在文件中的Avro的模式。跟加载的文件类似,还有很多其他方法来告诉AvroStorage你的schma 细节,这些都可以从wiki Pig 文档获得:[38]38 Additional resources on AvroStorage are at https://cwiki.apache.org/confluence/display/PIG/AvroStorage.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: