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

15 篇文章 0 订阅
5 篇文章 0 订阅

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.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/');
当把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.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值