整套大数据学习资料(视频+笔记)百度网盘无门槛下载:http://www.edu360.cn/news/content?id=3377

4.4.4互操作性

hadoop 花牛 12℃ 0评论

为了说明Avro的语言互操作性,让我们试着用一种语言(Python)来写入数据文件,用另一种语言来读取这个文件。

关于 PythonAPI

范例4-10中的程序从标准输入中读取由逗号分隔的字符串,并将它们以StringPair记录的方式写入Avro数据文件。与写数据文件的Java代码类 似,我们新建了一个DaturnWriter对象和一个DataFileWriter对象,注 意,我们在代码中嵌入了 Avro模式,尽管没有该模式,我们仍然可以从文件中正确读取数据。

Python以目录形式表示Avro记录,从标准输入中读取的每一行都转换为dict对象并被附加到DataFileWriter对象末尾。

范例4-10.这个Python程序将Avro的成对形式的记录写入一个数据文件

import os
import string
import sys
from avro import schema
from avro import io
from avro import datafile
if __name__ == "__main__":
    if len(sys.angv) != 2:
        sys.exit('Usage: %s <data_file>' % sys.argv[0])
    avro_file = sys.argv[1]
    writer = open(avro_file, 'wb')
    datum_writer = io.DatumWriter()
    schema_object = schema.parse("\
    { "type": "record",
    "name": "Pair",
    "doc": "StringPair",
    "fields":[
        {"name": "left", "type": "strijig"},
        {"name": "right", "type": "string")
    }")
    dfw = datafile.DataFileWriter(writer, datum_writer, schema_object)
    for line in sys.stdin.readlines():
        (left,right) = string.split(line.strip(),',')
        dfw.append({'left':left, 'right':right});
    dfw.close()

在运行该程序之前,我们需要为Python安装Avro:

% easy_install avro

为了行该程序,我们指定文件名(pairs.avro,输出结果会被写到这个文件)和通过标准输入发送输入的成对记录,结束文件输入时键入CtrlD:

% python avro/src/main/py/write_pairs.py pairs.avro
a,1
c,2
b,3
b,2
^D

关于C API

下面转向C API,写程序显示pairs.avro文件的内容,如范例4-11所示。一般情况下,Avro工具JAR文件有一个tojson命令,该命令可以将Avro数据文件中的内容转储为JSON。

范例4-11.这个C程序从数据文件中读取Avro的成对记录

#include <avro.h>
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[]) {
    if (argc != 2) {
        fprintf(stderr, "Usage: dump_pairs <data_file>\n");
        exit(EXIT_FAILURE);
    }
    const char *avrofile = argv[1];
    avro_schema_error_t error;
    avro_file_reader_t filereader;
    avro_datum_t pair;
    avro_datum_t left;
    avro_datum_t right;
    int rval;
    char *p;
    avro_file_reader(avrofile, &filereader):
    while (1) {
        rval = avro_file_reader_read(filereader,NULL, &pair);
        if (rval) break;
        if (avro_record_get(pair, "left", &left) == 0) {
            avro_string_get(left, &p);
            fprintf(stdout, "%s,", p);
        }
        if (avro_record_get(pair, "right", &right) == 0) {
            avro_string_get(right, &p);
            fprintf(stdout, "%s\n", p);
        }
    }
    avro_file_reader_close(filereader);
    return 0;
}

该程序的核心部分主要处理三件事情。

· 通过调用Avro的avro_file_reader函数打开一个 avro_file_reader_t类型的文件读取实例。Avro的方法和类型都有avro_前缀,并在avro.h文件中定义。

· 通过文件读取实例的avro—file^eader'方法循环读取Avro数据 直到读完所有的成对记录(由返回值rval决定)。

· 通过avro_file_reader_close方法关闭文件读取实例。

将数据模式作为avrc_file_reader_read方法的第二个参数,即可支持读取模式不同于文件写入模式的情况(下一节将详细说明),但如果参数设为null则说明希望Avro使用数据文件的模式来读取数据。第三个参数为指向avro_datuin_t对象的指针,该指针的内容是从文件中读取的下一条记录的内容。通过调用avro_record_get方法,我们将成对的结构分解成两个字段,然后通过avro_string_get方法抽取出每个字段的值,最后打印输出到控制台。

使用Python程序的输出来运行程序,打印出以下原始输入:

% ./dump_pairs pairs.avro
a,1
c,2
b,3
b,2

这样,我们便成功交换了两个Avro实现的复杂数据。

转载请注明:全栈大数据 » 4.4.4互操作性

喜欢 (0)or分享 (0)
发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址