当前位置: 首页 > 知识库问答 >
问题:

avro架构中的问题..字符串,null

丰辰沛
2023-03-14

在此avro模式中

{"type": "record",
"name": "Member",
"fields": [
 {"name": "name", "type": ["string", "null"] },
 {"name": "skill", "type": "string"}
]}

当我试着给名字分配多个值,比如多个记录...

ByteArrayOutputStream bos=new ByteArrayOutputStream();
Encoder e= EncoderFactory.get().binaryEncoder(bos, null);
GenericRecord rec=new GenericData.Record(schema);
GenericDatumWriter<GenericRecord> datumWriter = new GenericDatumWriter<GenericRecord>(schema);

for(int i=0;i<memlist.size();i++)
{
   rec.put("name", memlist.get(i).name);
   rec.put("skill", memlist.get(i).skill);
   datumWriter.write(rec, e);
}

e.flush();
bos.close();
System.out.println(bos.toString());

它总是为模式中的NAME字段指定Null...除了我放入的第一条记录...有没有方法可以将default用作字符串...如果没有字符串,那么它只使用模式中提到的Null

如上所述,联合是使用JSON数组表示的。例如,[“string”,“null”]声明一个模式,该模式既可以是字符串,也可以是null。

联合不能包含多个具有相同类型的架构,命名类型record、fixed和Enum除外。例如,不允许包含两个数组类型或两个映射类型的联合,但允许使用不同名称的两个类型。(名称允许在读写联合时进行有效的解析。)

因此即使除了第一条记录之外存在字符串值,它也总是取空值

共有1个答案

葛念
2023-03-14

不确定我是否正确理解了您想要的内容,但为什么不为name字段指定一个默认值呢?

{"type": "record",
 "name": "Member",
 "fields": [
    {"name": "name", "type": ["string", "null"], "default": "unknown" },
    {"name": "skill", "type": "string"}
]}

然后,如果不显式地将字段值设置为null,则应该使用字符串默认值。

 类似资料:
  • Invoke-RestMethod:分析注释时出错。应为:*,得到W。路径'ApplicationName',行1,位置31。(错误代码:c2d09f7a-f31a-4db1-a448-8214b6ab65ed)在C:\inetpub\wwwroot\webiz_shane\customersqlscripts\powershell\20150522_scheduled_jobs_api_call

  • 我使用的是NiFi(v1.2)处理器ConvertJSONToAvro。我无法解析一个“记录”类型中仅包含2个元素中的1个元素的记录。数据中也允许完全缺少该元素。我的Avro模式不正确吗? 架构片段: 如果“personname”同时包含“first”和“last”,它就可以工作,但是如果它只包含其中一个元素,它就会失败,错误是:无法转换字段personname:无法解析联合:{“last”:“S

  • 我试图使用Avro模式向我的经纪人发送消息,但“我总是收到错误: 2020-02-01 11:24:37.189[nioEventLoopGroup-4-1]错误应用程序-未经处理:POST-/api/orchestration/org。阿帕奇。Kafka。常见的错误。SerializationException:注册Avro架构时出错:io导致“字符串”。汇合的。Kafka。阴谋论。客户Rest

  • 这实际上与我之前的问题相同,但使用Avro而不是JSON作为数据格式。 我正在使用一个Spark数据框架,它可以从几个不同的模式版本之一加载数据: 我正在使用Spark Avro加载数据。 它可能是版本一文件或版本二文件。但是我希望能够以相同的方式处理它,将未知值设置为“null”。我之前的问题中的建议是设置模式,但是我不想重复自己在文件中编写模式,也不想重复自己在和朋友中编写模式。如何将avro

  • 问题内容: 我正在阅读oracle的基础知识,并遇到了奇怪的陈述。我不知道这是真的。 声明说 “字符串值‘2’大于字符串值‘100’。字符‘1’小于字符‘10’。” 请就上述话题发表一些看法。我了解必须使用ASCII值进行内部比较。我正在寻求一些合理的解释。 问题答案: 这意味着被视为字符串的数字不是按 数字顺序 而是按 词汇顺序排序 ,这与字典中单词的排序方式相同。即,从左侧一次比较一个字符。

  • 我们都知道计算机只能处理数字,如果要处理文本,就必须先把文本转换为数字才能处理。最早的计算机在设计时采用8个比特(bit)作为一个字节(byte),所以,一个字节能表示的最大的整数就是255(二进制11111111=十进制255),0 - 255被用来表示大小写英文字母、数字和一些符号,这个编码表被称为ASCII编码,比如大写字母 A 的编码是 65,小写字母 z 的编码是 122。 如果要表示中