- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
如何获得包含数组值的 map ?
我使用avro1.7.7,我的架构如下:
{
"type":"map",
"values":{
"type":"array",
"items":"int"
}
}
我的程序是这样的:
main.c
/*
* File: main.c
* Author: zwlin
*
* Created on 2016年4月21日, 下午5:16
*/
#include <stdio.h>
#include <stdarg.h>
#include <avro.h>
#define iout(i); sout("%d",i);
#define cout(c); sout("%c",c);
#define lout(l); sout("%ld",l);
#define piout(str,i); sout("%s:%d",str,i);
#define psout(str,s); sout("%s:%s",str,s);
#define pcout(str,c); sout("%s:%c",str,c);
#define plout(str,l);sout("%s,%l",str,l);
//for output
void sout(const char *format, ...) {
va_list args;
va_start(args, format);
vfprintf(stdout, format, args);
fprintf(stdout, "\n");
va_end(args);
}
int main() {
int res, i, j, k;
avro_schema_t schema;
avro_datum_t rec;
//schema
avro_schema_t int_array_schema = avro_schema_array(avro_schema_int());
avro_schema_t int_map_schema = avro_schema_map(int_array_schema);
avro_schema_t int_union_schema = avro_schema_union();
avro_schema_union_append(int_union_schema, int_map_schema);
avro_schema_union_append(int_union_schema, avro_schema_null());
//choose schema
// schema = int_array_schema;
schema = int_map_schema;
// schema = int_union_schema;
//print schema
char schemaPrintBuf [1024];
avro_writer_t jswriter = avro_writer_memory(schemaPrintBuf, 1024);
avro_schema_to_json(schema, jswriter);
psout("schema", schemaPrintBuf);
//data
int intry[] = {9, 8, 7, 6, 5, 4, 3};
avro_datum_t int_array = avro_array(int_array_schema);
for (i = 0; i < 7; ++i) {
avro_datum_t vt = avro_int32(intry[i]);
res = avro_array_append_datum(int_array, vt);
avro_datum_decref(vt);
}
avro_datum_t int_map = avro_map(int_map_schema);
res = avro_map_set(int_map, "intarray", int_array);
avro_datum_decref(int_array);
avro_datum_t int_a_union_datum = avro_union(int_union_schema, 0, int_map);
//choose data
// rec = int_array;
rec = int_map;
// rec = int_a_union_datum;
//print data detail
sout("");
char * json;
sout("rec:");
avro_datum_to_json(rec, 0, &json);
sout(json);
//serialize
char buf[1024];
avro_writer_t writer = avro_writer_memory(buf, 1024);
res = avro_write_data(writer, schema, rec);
if (res) {
psout("write result", avro_strerror());
}
long len = avro_size_data(writer, schema, rec);
piout("data len", len);
//read
avro_reader_t reader = avro_reader_memory(buf, 1024);
avro_datum_t rslt;
res = avro_read_data(reader, schema, schema, &rslt);
if (res) {
psout("read error ", avro_strerror());
}
//read data
sout("");
sout("rslt:");
avro_datum_to_json(rslt, 0, &json);
sout(json);
return 0;
}
这是我的目标架构:avro_schema_t schema;
这是我的数据:avro_datum_t rec;
在//选择架构
和//选择数据
部分,
如果 schema = int_array_schema
和 rec = int_array
,
输出如下:
int_arry_schema output picture
如果 schema = int_map_schema
和 rec = int_map
,
输出如下:
int_map_schema output picture
段错误出现在此处:res = avro_write_data(writer, schema, rec);
。
那么,我怎样才能拥有一个包含数组作为值的 map ?
最佳答案
您似乎没有做任何与代码相关的错误;然而,自从该项目转向“通用值”格式并为新 API 实现了遗留包装器以来,看起来这是向后兼容性方面的一个错误。
如果您从代码中构建的 json 重新生成架构,它就会起作用,这似乎表明功能回归:
所以在这里,如果我们生成架构的新副本:
psout("schema", schemaPrintBuf);
avro_schema_t from_json;
if (!avro_schema_from_json_literal(schemaPrintBuf, &from_json)) {
fprintf(stderr, "Cannot convert from json literal: %s", avro_strerror());
exit(1);
}
// then in the write:
res = avro_write_data(writer, from_json, rec);
它不再崩溃 - 这只是替换单个架构引用 - 如果您在重新读取时保留对架构的其他引用,它看起来好像可以工作。
或者,由于您基于已知的手动构建的架构构建了 avro_datum_t
,因此您可以禁用编写器验证,这似乎是崩溃的根源:
res = avro_write_data(writer, NULL, rec);
在这种情况下不会崩溃 - 在这种情况下,架构验证可能会有些复杂。
关于c - 如何在avro-c中使用数组作为map的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36881462/
我在名为 commonSourceMetadata.avsc 的 json 文件中定义了一个名为 "some.package.SourceMetadata" 的 Avro 类型: { "type"
我很想了解在 Avro 中编码两种非常特定类型的数据的最佳实践:时间戳和 IP 地址。 我遇到了时间戳 ( https://issues.apache.org/jira/browse/AVRO-739
如何在 Avro Schema 生成中为数据类型设置最大大小/长度限制。例如:在模式中,我想指定一个字段,该字段采用最大 len 25 的字符串。 最佳答案 我相信您可以使用“固定”avro 类型并指
即是否可以使字段需要类似于 ProtoBuf: 消息搜索请求{ 需要 字符串查询 = 1; } 最佳答案 默认情况下,Avro 中的所有字段都是必需的。照原样 mentioned在官方文档中,如果你想
我有用户编写 AVRO 文件,我想使用 Flume 将所有这些文件移动到使用 Flume 的 HDFS 中。所以我以后可以使用 Hive 或 Pig 来查询/分析数据。 在客户端我安装了 flume
我正在为似乎具有多个对象数组的 JSON 有效负载创建 avro 模式。我不确定如何在模式中表示这一点。有问题的关键是 content: { "id": "channel-id", "name
似乎没有任何方法可以将数据附加到现有的 Avro 序列化文件中。我想让多个进程写入一个 avro 文件,但看起来每次打开它时,我都会从头开始。我不想读入所有数据,然后再将其写回。 使用 ruby
我试图定义一个不太平凡的 Avro 模式,但收效甚微;当它不会抛出架构语法错误时,它不会生成我试图在架构中定义的所有类型。 是否有 avsc 定义的可能内容的完整规范?我一直根据我从 Doc 规范中理
我正在尝试使用 avro-tools-1.7.4.jar create schema 命令创建两个 Avro 模式。 我有两个 JSON 模式,如下所示: { "name": "TestAvro",
首先,我创建了一个如下所示的 avro hive 表。 CREATE EXTERNAL TABLE user STORED AS AVRO LOCATION '/work/user' TBLPROPE
我正在读一本书 Hadoop application architectures,这本书很老但很有趣,在阅读时,我注意到 Avro 被认为是数据序列化框架,而 Parquet 被认为是列数据格式。 我
我一直在四处寻找,看到了 jira https://issues.apache.org/jira/browse/AVRO-739对于这个问题,但我对用户文档中的日期时间的 avro 支持没有更好的了解
我尝试在安装了 Spark 2.4.8 的 Cloud Dataproc 集群 1.4 上运行我的 Spark/Scala 代码 2.3.0。我在读取 avro 文件时遇到错误。这是我的代码: spa
我正在处理 JSON 格式的服务器日志,我想以 Parquet 格式将我的日志存储在 AWS S3 上(并且 Parquet 需要 Avro 模式)。首先,所有日志都有一组共同的字段,其次,所有日志都
这是来自教程点的解串器。 public class Deserialize { public static void main(String args[]) throws Exception{
我正在使用 avro-maven-plugin 1.8.1 从 schema 生成 java 代码,所有字段都是公共(public)的且已弃用,如下所示: public class data_el
一个简单的例子说明了我的问题。 本质上,我正在处理一个跨多个存储库拆分代码的大型项目。在 repo 1 中,在 .avdl 文件中定义了一个 Avro 模式“S1”,该文件被编译到其 Avro 生成的
通过套接字发送avro(avro c)编码数据我正在尝试将 avro 编码数据转换为字节数组(使用 memcpy)后通过套接字发送。我所做的如下所示 /客户端:client.c/ avro_datum
我的问题是这样的。我有一个 2GB 的压缩 avro 文件,HDFS 上存储了大约 1000 条 avro 记录。我知道我可以编写代码来“打开这个 avro 文件”并打印出每条 avro 记录。我的问
我看到以下错误 exception Unsupported Avro type. Supported types are null, Boolean, Integer, Long, Float, Do
我是一名优秀的程序员,十分优秀!