9.11. 拼花地板转换器

拼图转换器处理由写入的数据 Apache Parque 。要使用拼图转换器,请指定 type = "parquet" 在您的转换器定义中。

9.11.1. 配置

拼图转换器支持解析整个拼图文件。由于Parquet随机访问API,文件路径必须在 EvaluationContext 。此外,纯流转换是不可能的(即使用bash管道重定向到 ingestconvert 命令)。

由于Parquet没有定义任何对象模型,因此标准做法是将Parquet文件解析为Avro GenericRecords。

正在分析的Avro GenericRecord可用于字段转换,如下所示 $0

9.11.2. Avro路径

因为拼图文件被转换为Avro记录,所以可以使用Avro路径来选择元素。看见 Avro变流器 有关Avro路径的详细信息。请注意,avro路径表达式的结果将根据拼图列类型(例如,字符串、双精度、列表等)进行适当的类型化。

9.11.3. 拼花变换函数

除了在中定义的变换函数外,GeoMesa还定义了几个镶木地板特定的变换函数 Avro变换函数

9.11.3.1. ParquetPoint

描述:从拼图记录解析嵌套的Point结构

用途: parquetPoint($ref, $pathString)

  • $ref -引用对象(Avro根记录或提取对象)

  • pathString -正斜杠分隔的路径字符串。看见 Avro Paths ,上图

POINT函数可以解析GeoMesa编码的点列,它由名为的两个双类型列组成的拼图组组成 xy

9.11.3.2. ParquetLineString

描述:从拼图记录中分析嵌套的线串结构

用途: parquetLineString($ref, $pathString)

  • $ref -引用对象(Avro根记录或提取对象)

  • pathString -正斜杠分隔的路径字符串。看见 Avro Paths ,上图

LINESTRING函数可解析GeoMesa编码的LineString列,这些列由名为的两个重复双类型列组成的拼图组组成 xy

9.11.3.3. ParquetPolygon

描述:从拼图记录解析嵌套的面结构

用途: parquetPolygon($ref, $pathString)

  • $ref -引用对象(Avro根记录或提取对象)

  • pathString -正斜杠分隔的路径字符串。看见 Avro Paths ,上图

面函数可以解析以GeoMesa编码的面列,这些列由名为的两个列表类型列组成的拼图组组成 xy 。列表元素是重复的双类型列。

9.11.3.4. ParquetMultiPoint

描述:从拼图记录解析嵌套的多点结构

用途: parquetMultiPoint($ref, $pathString)

  • $ref -引用对象(Avro根记录或提取对象)

  • pathString -正斜杠分隔的路径字符串。看见 Avro Paths ,上图

多点函数可以解析GeoMesa编码的多点列,这些列由名为的两个重复的双类型列组成的拼图组组成 xy

9.11.3.5. ParquetMultiLineString

描述:从拼图记录分析嵌套的多行字符串结构

用途: parquetMultiLineString($ref, $pathString)

  • $ref -引用对象(Avro根记录或提取对象)

  • pathString -正斜杠分隔的路径字符串。看见 Avro Paths ,上图

多线串函数可以解析GeoMesa编码的多线串列,这些列由名为的两个列表类型列组成的拼图组组成 xy 。列表元素是重复的双类型列。

9.11.3.6. ParquetMultiPolygon

描述:从拼图记录解析嵌套的多重多边形结构

用途: parquetMultiPolygon($ref, $pathString)

  • $ref -引用对象(Avro根记录或提取对象)

  • pathString -正斜杠分隔的路径字符串。看见 Avro Paths ,上图

多面体函数可以解析GeoMesa编码的多面体列,这些列由名为的两个列表类型列组成的拼图组组成 xy 。列表元素也是列表,嵌套的列表元素是重复的双类型列。

9.11.4. 用法示例

对于本例,我们将考虑以下JSON文件:

{ "id": 1, "number": 123, "color": "red",   "physical": { "weight": 127.5,   "height": "5'11" }, "lat": 0,   "lon": 0 }
{ "id": 2, "number": 456, "color": "blue",  "physical": { "weight": 150,     "height": "5'11" }, "lat": 1,   "lon": 1 }
{ "id": 3, "number": 789, "color": "green", "physical": { "weight": 200.4,   "height": "6'2" },  "lat": 4.4, "lon": 3.3 }

可以使用Spark将此文件转换为拼花:

import org.apache.spark.sql.SparkSession
val session = SparkSession.builder().appName("testSpark").master("local[*]").getOrCreate()
val df = session.read.json("/tmp/example.json")
df.write.option("compression","gzip").parquet("/tmp/example.parquet")

以下SimpleFeatureType和转换器足以解析生成的Parquet文件:

{
  "geomesa" : {
    "sfts" : {
      "example" : {
         "fields" : [
          { "name" : "color",  "type" : "String" }
          { "name" : "number", "type" : "Long"   }
          { "name" : "height", "type" : "String" }
          { "name" : "weight", "type" : "Double" }
          { "name" : "geom",   "type" : "Point", "srid" : 4326 }
        ]
      }
    },
    "converters" : {
      "example" : {
        "type" : "parquet",
        "id-field" : "avroPath($0, '/id')",
        "fields" : [
          { "name" : "color",  "transform" : "avroPath($0,'/color')" },
          { "name" : "number", "transform" : "avroPath($0,'/number')" },
          { "name" : "height", "transform" : "avroPath($0,'/physical/height')" },
          { "name" : "weight", "transform" : "avroPath($0,'/physical/weight')" },
          { "name" : "geom",   "transform" : "point(avroPath($0,'/lon'),avroPath($0,'/lat'))" }
        ],
        "options" : {
          "encoding" : "UTF-8",
          "error-mode" : "skip-bad-records",
          "parse-mode" : "incremental",
          "validators" : [ "index" ]
        }
      }
    }
  }
}