9.9. Avro变流器¶
Avro转换器处理由写入的数据 Apache Avro 。要使用Avro转换器,请指定 type = "avro"
在您的转换器定义中。
9.9.1. 配置¶
Avro转换器支持解析嵌入模式的整个Avro文件,或省略模式的Avro IPC消息。对于嵌入的架构,设置 schema = "embedded"
在您的转换器定义中。对于IPC消息,请使用以下两种方式之一指定架构:要使用内联架构字符串,请设置 schema = "<schema string>"
;若要使用在单独文件中定义的架构,请设置 schema-file = "<path to file>"
。
正在解析的Avro记录可用于字段转换,如 $1
。
9.9.2. Avro路径¶
Avro路径的定义类似于JSONPath或XPath,允许您从avro记录中提取特定的字段。Avro路径由正斜杠分隔的字符串组成。路径的每个部分定义一个带有可选谓词的字段名称:
$type=<typename>
-匹配选定元素上的Avro架构类型名称[$<field>=<value>]
-将元素与名为“field”且值等于“Value”的字段进行匹配
例如, /foo$type=bar/baz[$qux=quux]
。看见 Example Usage ,下面是一个具体的例子。
Avro路径可通过 avroPath
变换函数,如下所述。
9.9.3. Avro变换函数¶
GeoMesa定义了几个Avro特定的变换函数。
9.9.3.1. AvroPath¶
描述:从嵌套的Avro结构中提取值。
用途: avroPath($ref, $pathString)
$ref
-参考对象(Avro根或提取对象)pathString
-正斜杠分隔的路径字符串。看见 Avro Paths ,上图
9.9.3.2. AvroBinaryList¶
GeoMesa有一个用于编写SimpleFeature的定制Avro模式。列表、映射和UUID属性被序列化为二进制Avro字段。此函数可以读取序列化的列表类型属性。
描述:将二进制Avro值解析为列表
用途: avroBinaryList($ref)
9.9.3.3. AvroBinaryMap¶
GeoMesa有一个用于编写SimpleFeature的定制Avro模式。列表、映射和UUID属性被序列化为二进制Avro字段。此函数可以读取序列化的映射型属性。
描述:将二进制Avro值解析为地图
用途: avroBinaryMap($ref)
9.9.3.4. AvroBinaryUuid¶
GeoMesa有一个用于编写SimpleFeature的定制Avro模式。列表、映射和UUID属性被序列化为二进制Avro字段。此函数可以读取序列化的UUID类型属性。
描述:将二进制Avro值解析为UUID
用途: avroBinaryUuid($ref)
9.9.4. 用法示例¶
对于本例,我们将在名为的文件中使用以下Avro架构 /tmp/schema.avsc
:
{
"namespace": "org.locationtech",
"type": "record",
"name": "CompositeMessage",
"fields": [
{ "name": "content",
"type": [
{
"name": "DataObj",
"type": "record",
"fields": [
{
"name": "kvmap",
"type": {
"type": "array",
"items": {
"name": "kvpair",
"type": "record",
"fields": [
{ "name": "k", "type": "string" },
{ "name": "v", "type": ["string", "double", "int", "null"] }
]
}
}
}
]
},
{
"name": "OtherObject",
"type": "record",
"fields": [{ "name": "id", "type": "int"}]
}
]
}
]
}
此方案定义了一个Avro文件,该文件具有一个名为的字段 content
它具有嵌套的对象,该对象的类型为 DataObj
或 OtherObject
。作为练习,我们可以使用Avro工具生成一些测试数据并进行查看:
java -jar /tmp/avro-tools-1.7.7.jar random --schema-file /tmp/schema -count 5 /tmp/avro
$ java -jar /tmp/avro-tools-1.7.7.jar tojson /tmp/avro
{"content":{"org.locationtech.DataObj":{"kvmap":[{"k":"thhxhumkykubls","v":{"double":0.8793488185997134}},{"k":"mlungpiegrlof","v":{"double":0.45718223406586045}},{"k":"mtslijkjdt","v":null}]}}}
{"content":{"org.locationtech.OtherObject":{"id":-86025408}}}
{"content":{"org.locationtech.DataObj":{"kvmap":[]}}}
{"content":{"org.locationtech.DataObj":{"kvmap":[{"k":"aeqfvfhokutpovl","v":{"string":"kykfkitoqk"}},{"k":"omoeoo","v":{"string":"f"}}]}}}
{"content":{"org.locationtech.DataObj":{"kvmap":[{"k":"jdfpnxtleoh","v":{"double":0.7748286862915655}},{"k":"bueqwtmesmeesthinscnreqamlwdxprseejpkrrljfhdkijosnogusomvmjkvbljrfjafhrbytrfayxhptfpcropkfjcgs","v":{"int":-1787843080}},{"k":"nmopnvrcjyar","v":null},{"k":"i","v":{"string":"hcslpunas"}}]}}}
以下是更相关的示例记录:
{
"content" : {
"org.locationtech.DataObj" : {
"kvmap" : [ {
"k" : "lat",
"v" : {
"double" : 45.0
}
}, {
"k" : "lon",
"v" : {
"double" : 45.0
}
}, {
"k" : "prop3",
"v" : {
"string" : " foo "
}
}, {
"k" : "prop4",
"v" : {
"double" : 1.0
}
} ]
}
}
}
比方说,我们想要将我们的avro数组的kv对转换为一个简单的功能。我们注意到有4个属性:
稍后
长
3号提案
第4号提案
以下转换器配置足以解析avro::
{
type = "avro"
schema-file = "/tmp/schema.avsc"
sft = "testsft"
id-field = "uuid()"
fields = [
{ name = "tobj", transform = "avroPath($1, '/content$type=DataObj')" },
{ name = "lat", transform = "avroPath($tobj, '/kvmap[$k=lat]/v')" },
{ name = "lon", transform = "avroPath($tobj, '/kvmap[$k=lon]/v')" },
{ name = "geom", transform = "point($lon, $lat)" }
]
}