所有这些都提供了二进制序列化,RPC框架和IDL.我对它们与特性(性能,易用性,编程语言支持)之间的关键差异感兴趣.
如果您了解任何其他类似技术,请在答案中提及.
Apache Parquet的特点是:
与Avro,序列文件,RC文件等相比.我想要格式的概述.我已经读过:Impala如何与Hadoop文件格式配合使用,它提供了一些格式的见解,但我想知道如何以这些格式完成数据访问和数据存储.木地板如何优于其他木地板?
我打算在hadoop相关项目中使用hadoop文件格式之一.我知道实木复合地板对于基于列的查询是有效的,而avro可用于全扫描或当我们需要所有列数据时!
在我继续选择其中一种文件格式之前,我想了解一种文件格式的缺点/缺点.任何人都可以用简单的语言向我解释一下吗?
我遇到了一些设置Avro字段默认值的问题.我有一个简单的架构,如下所示:
data.avsc:
{
"namespace":"test",
"type":"record",
"name":"Data",
"fields":[
{ "name": "id", "type": [ "long", "null" ] },
{ "name": "value", "type": [ "string", "null" ] },
{ "name": "raw", "type": [ "bytes", "null" ] }
]
}
Run Code Online (Sandbox Code Playgroud)
我使用avro-maven-plugin v1.7.6生成Java模型.
当我使用:创建模型的实例时
Data data = Data.newBuilder().build();,它失败并出现异常:
org.apache.avro.AvroRuntimeException:org.apache.avro.AvroRuntimeException:字段ID类型:UNION pos:0未设置且没有默认值.
但是如果我指定"默认"属性,
{ "name": "id", "type": [ "long", "null" ], "default": "null" },
Run Code Online (Sandbox Code Playgroud)
我没有得到这个错误.我在文档中读到联合中的第一个模式成为默认模式.所以我的问题是,为什么我仍然需要指定"默认"属性?我怎么做一个字段可选?
如果我确实需要指定默认值,那么它对联合的作用如何; 我是否需要为联合中的每个模式指定默认值,以及它在顺序/语法方面如何工作?
谢谢.
目前我们正在生产中使用Avro数据格式.在Avro的N个优点中,我们知道它在模式演化方面很有用.
现在我们正在评估Parquet格式,因为它在阅读随机列时具有很高的效率.所以在继续前进之前我们关心的是架构演变!
有谁知道,如果模式演化是可能的实木复合地板,如果是如何,如果没有为什么.一些演示文稿说它是可能的但是只能在最后添加列
这是什么意思?
我正在尝试使用Avro来读取/写入Kafka的消息.有没有人有一个使用Avro二进制编码器编码/解码将被放在消息队列中的数据的例子?
我需要Avro部件而不是Kafka部件.或者,也许我应该看一个不同的解决方案?基本上,我正试图在空间方面找到更有效的JSON解决方案.刚刚提到Avro,因为它比JSON更紧凑.
我正在尝试让Python解析Avro架构,如下所示......
from avro import schema
mySchema = """
{
"name": "person",
"type": "record",
"fields": [
{"name": "firstname", "type": "string"},
{"name": "lastname", "type": "string"},
{
"name": "address",
"type": "record",
"fields": [
{"name": "streetaddress", "type": "string"},
{"name": "city", "type": "string"}
]
}
]
}"""
parsedSchema = schema.parse(mySchema)
Run Code Online (Sandbox Code Playgroud)
......我得到以下异常:
avro.schema.SchemaParseException: Type property "record" not a valid Avro schema: Could not make an Avro Schema object from record.
Run Code Online (Sandbox Code Playgroud)
我究竟做错了什么?
有谁知道如何创建包含某些类对象列表的Avro架构?
我希望我生成的类如下所示:
class Child {
String name;
}
class Parent {
list<Child> children;
}
Run Code Online (Sandbox Code Playgroud)
为此,我编写了部分模式文件,但不知道如何告诉Avro创建类型对象列表Children?
我的架构文件如下所示:
{
"name": "Parent",
"type":"record",
"fields":[
{
"name":"children",
"type":{
"name":"Child",
"type":"record",
"fields":[
{"name":"name", "type":"string"}
]
}
}
]
}
Run Code Online (Sandbox Code Playgroud)
现在问题是我可以将字段标记children为Child类型或数组,但不知道如何将其标记为array of objects of type Child类?
有人可以帮忙吗?
我们需要序列化一些数据以放入solr和hadoop.
我正在评估序列化工具.
我名单中的前两位是Gson和Avro.
据我所知,Avro = Gson + Schema-In-JSON
如果这是正确的,我不明白为什么Avro如此受Solr/Hadoop的欢迎?
我在互联网上搜索了很多,但找不到一个正确的答案.
它所说的任何地方,Avro都很好,因为它存储架构.我的问题是如何处理该架构?
对于Hadoop中的非常大的对象可能是好的,其中单个对象存储在多个文件块中,使得存储每个部分的模式有助于更好地分析它.但即使在这种情况下,模式也可以单独存储,只需对其进行引用就足以描述模式.我认为没有理由为什么架构应该成为每一件作品的一部分.
如果有人可以给我一些好的用例,Avro如何帮助他们,而Gson/Jackson不能达到此目的,那将非常有帮助.
此外,Avro网站上的官方文档说我们需要为Avro提供一个架构,以帮助它生成Schema + Data.我的问题是,如果输入架构并将相同的数据发送到输出以及数据的JSON表示,那么Avro正在实现什么额外的?我可以不通过使用JSON序列化对象,添加我的输入模式并将其称为Avro来自己做吗?
我真的很困惑!
是否可以编写一个Avro架构/ IDL来生成扩展基类或实现接口的Java类?似乎生成的Java类扩展了org.apache.avro.specific.SpecificRecordBase.因此,工具可能是要走的路.但是,我不知道这是否可行.
我已经看到了一些示例,其中提出了在每个特定模式中定义显式"类型"字段的建议,其中包含的关联多于继承语义.
我在我的工厂类和代码的其他部分中大量使用我的基类<T extends BaseObject>.目前,我有从JSON Schema生成的代码,它支持继承.
另一个问题是:你可以使用IDL来定义没有协议定义的记录吗?我认为答案是否定的,因为编译器抱怨缺少协议关键字.
帮助赞赏!谢谢.