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 它具有嵌套的对象,该对象的类型为 DataObjOtherObject 。作为练习,我们可以使用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)" }
  ]
}