9.11. 拼花地板转换器¶
拼图转换器处理由写入的数据 Apache Parque 。要使用拼图转换器,请指定 type = "parquet"
在您的转换器定义中。
9.11.1. 配置¶
拼图转换器支持解析整个拼图文件。由于Parquet随机访问API,文件路径必须在 EvaluationContext
。此外,纯流转换是不可能的(即使用bash管道重定向到 ingest
或 convert
命令)。
由于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编码的点列,它由名为的两个双类型列组成的拼图组组成 x
和 y
。
9.11.3.2. ParquetLineString¶
描述:从拼图记录中分析嵌套的线串结构
用途: parquetLineString($ref, $pathString)
$ref
-引用对象(Avro根记录或提取对象)pathString
-正斜杠分隔的路径字符串。看见 Avro Paths ,上图
LINESTRING函数可解析GeoMesa编码的LineString列,这些列由名为的两个重复双类型列组成的拼图组组成 x
和 y
。
9.11.3.3. ParquetPolygon¶
描述:从拼图记录解析嵌套的面结构
用途: parquetPolygon($ref, $pathString)
$ref
-引用对象(Avro根记录或提取对象)pathString
-正斜杠分隔的路径字符串。看见 Avro Paths ,上图
面函数可以解析以GeoMesa编码的面列,这些列由名为的两个列表类型列组成的拼图组组成 x
和 y
。列表元素是重复的双类型列。
9.11.3.4. ParquetMultiPoint¶
描述:从拼图记录解析嵌套的多点结构
用途: parquetMultiPoint($ref, $pathString)
$ref
-引用对象(Avro根记录或提取对象)pathString
-正斜杠分隔的路径字符串。看见 Avro Paths ,上图
多点函数可以解析GeoMesa编码的多点列,这些列由名为的两个重复的双类型列组成的拼图组组成 x
和 y
。
9.11.3.5. ParquetMultiLineString¶
描述:从拼图记录分析嵌套的多行字符串结构
用途: parquetMultiLineString($ref, $pathString)
$ref
-引用对象(Avro根记录或提取对象)pathString
-正斜杠分隔的路径字符串。看见 Avro Paths ,上图
多线串函数可以解析GeoMesa编码的多线串列,这些列由名为的两个列表类型列组成的拼图组组成 x
和 y
。列表元素是重复的双类型列。
9.11.3.6. ParquetMultiPolygon¶
描述:从拼图记录解析嵌套的多重多边形结构
用途: parquetMultiPolygon($ref, $pathString)
$ref
-引用对象(Avro根记录或提取对象)pathString
-正斜杠分隔的路径字符串。看见 Avro Paths ,上图
多面体函数可以解析GeoMesa编码的多面体列,这些列由名为的两个列表类型列组成的拼图组组成 x
和 y
。列表元素也是列表,嵌套的列表元素是重复的双类型列。
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" ]
}
}
}
}
}