使用 NiFi 将空间数据从 Oracle (12+) 导入到 HDFS
Importing Spatial Data from Oracle (12+) to HDFS using NiFi
我正在尝试使用 NiFi 将数据从 Oracle 数据库 (12+) 迁移到 HDFS。处理器 "QueryDatabaseTable" 和 "ExecuteSQL" 似乎无法处理几何数据类型 (SDO_GEOMETRY)。
我遇到了错误
"Unkown SQL Type 2002, cannot be converted to avro type"
当使用 "sdo_util.to_wktgeometry()" 函数将数据类型转换为长字符串时,似乎不可行。对于第一个处理器和第二个给出错误:
"SDO_UTIL.TO_WKTGEOMETRY() illegal character"
有人有关于从 NiFi 的 Oracle (12+) 迁移 Geometry 数据类型的技巧吗?一个线串就足够了来自几何对象的信息(目前)
我想 NiFi 不知道如何处理关系数据库中定义的任何类型的对象类型。显然,对空间类型等复杂类型的理解要少得多。即使它确实理解对象类型,你也会留下一些难以使用的东西,因为它会暴露类型的内部结构,你需要深入检查 Oracle 手册来解码内容才能使用这些信息。
最简单的肯定是获取序列化字符串或二进制表示法中的空间类型。您可以在多种符号和两种获取这些符号的方法之间进行选择:
使用对象类型方法:
重要提示:请注意,您必须使用table别名才能调用对象方法!
WKT:
SQL> select c.location.get_wkt() from us_cities c where city='New York';
C.LOCATION.GET_WKT()
-------------------------------------------------------------------------------
POINT (-73.943849 40.6698)
1 row selected.
GML:
SQL> select c.location.get_gml() from us_cities c where city='New York';
C.LOCATION.GET_GML()
-------------------------------------------------------------------------------
<gml:Point srsName="EPSG:4326" xmlns:gml="http://www.opengis.net/gml"><gml:coordinates decimal="." cs="," ts=" ">-73.943849,40.6698 </gml:coordinates></gml:Point>
1 row selected.
GeoJSON:
SQL> select c.location.get_geojson() from us_cities c where city='New York';
C.LOCATION.GET_GEOJSON()
-------------------------------------------------------------------------------
{ "type": "Point", "coordinates": [-73.943849, 40.6698] }
1 row selected.
使用函数:
WKT
SQL> select sdo_util.to_wktgeometry(location) from us_cities c where city='New York';
SDO_UTIL.TO_WKTGEOMETRY(LOCATION)
-------------------------------------------------------------------------------
POINT (-73.943849 40.6698)
1 row selected.
GML
SQL> select sdo_util.to_gmlgeometry(location) from us_cities c where city='New York';
SDO_UTIL.TO_GMLGEOMETRY(LOCATION)
-------------------------------------------------------------------------------
<gml:Point srsName="EPSG:4326" xmlns:gml="http://www.opengis.net/gml"><gml:coordinates decimal="." cs="," ts=" ">-73.943849,40.6698 </gml:coordinates></gml:Point>
1 row selected.
GeoJSON
SQL> select sdo_util.to_geojson(location) from us_cities c where city='New York';
SDO_UTIL.TO_GEOJSON(LOCATION)
-------------------------------------------------------------------------------
{ "type": "Point", "coordinates": [-73.943849, 40.6698] }
1 row selected.
在这些例子中,我只展示了分数。几何当然可以更复杂:线、多线、多边形、多多边形、带空隙的多边形。还有 3D 结构:曲面和实体......
对于那些作为点的几何图形,您可以直接从对象中提取 X 和 Y 坐标。再次注意 aliases.
的使用
select city, c.location.sdo_point.x longitude, c.location.sdo_point.y latitude
from us_cities c;
CITY LONGITUDE LATITUDE
------------------------------ ---------- ----------
New York -73.943849 40.6698
Los Angeles -118.4112 34.112101
....
Sioux Falls -96.7301 43.544201
Simi Valley -118.7513 34.26305
195 rows selected.
对于其他几何图形(线条等),则需要通过文本序列化进行传递。
我正在尝试使用 NiFi 将数据从 Oracle 数据库 (12+) 迁移到 HDFS。处理器 "QueryDatabaseTable" 和 "ExecuteSQL" 似乎无法处理几何数据类型 (SDO_GEOMETRY)。
我遇到了错误 "Unkown SQL Type 2002, cannot be converted to avro type"
当使用 "sdo_util.to_wktgeometry()" 函数将数据类型转换为长字符串时,似乎不可行。对于第一个处理器和第二个给出错误: "SDO_UTIL.TO_WKTGEOMETRY() illegal character"
有人有关于从 NiFi 的 Oracle (12+) 迁移 Geometry 数据类型的技巧吗?一个线串就足够了来自几何对象的信息(目前)
我想 NiFi 不知道如何处理关系数据库中定义的任何类型的对象类型。显然,对空间类型等复杂类型的理解要少得多。即使它确实理解对象类型,你也会留下一些难以使用的东西,因为它会暴露类型的内部结构,你需要深入检查 Oracle 手册来解码内容才能使用这些信息。
最简单的肯定是获取序列化字符串或二进制表示法中的空间类型。您可以在多种符号和两种获取这些符号的方法之间进行选择:
使用对象类型方法:
重要提示:请注意,您必须使用table别名才能调用对象方法!
WKT:
SQL> select c.location.get_wkt() from us_cities c where city='New York';
C.LOCATION.GET_WKT()
-------------------------------------------------------------------------------
POINT (-73.943849 40.6698)
1 row selected.
GML:
SQL> select c.location.get_gml() from us_cities c where city='New York';
C.LOCATION.GET_GML()
-------------------------------------------------------------------------------
<gml:Point srsName="EPSG:4326" xmlns:gml="http://www.opengis.net/gml"><gml:coordinates decimal="." cs="," ts=" ">-73.943849,40.6698 </gml:coordinates></gml:Point>
1 row selected.
GeoJSON:
SQL> select c.location.get_geojson() from us_cities c where city='New York';
C.LOCATION.GET_GEOJSON()
-------------------------------------------------------------------------------
{ "type": "Point", "coordinates": [-73.943849, 40.6698] }
1 row selected.
使用函数:
WKT
SQL> select sdo_util.to_wktgeometry(location) from us_cities c where city='New York';
SDO_UTIL.TO_WKTGEOMETRY(LOCATION)
-------------------------------------------------------------------------------
POINT (-73.943849 40.6698)
1 row selected.
GML
SQL> select sdo_util.to_gmlgeometry(location) from us_cities c where city='New York';
SDO_UTIL.TO_GMLGEOMETRY(LOCATION)
-------------------------------------------------------------------------------
<gml:Point srsName="EPSG:4326" xmlns:gml="http://www.opengis.net/gml"><gml:coordinates decimal="." cs="," ts=" ">-73.943849,40.6698 </gml:coordinates></gml:Point>
1 row selected.
GeoJSON
SQL> select sdo_util.to_geojson(location) from us_cities c where city='New York';
SDO_UTIL.TO_GEOJSON(LOCATION)
-------------------------------------------------------------------------------
{ "type": "Point", "coordinates": [-73.943849, 40.6698] }
1 row selected.
在这些例子中,我只展示了分数。几何当然可以更复杂:线、多线、多边形、多多边形、带空隙的多边形。还有 3D 结构:曲面和实体......
对于那些作为点的几何图形,您可以直接从对象中提取 X 和 Y 坐标。再次注意 aliases.
的使用select city, c.location.sdo_point.x longitude, c.location.sdo_point.y latitude
from us_cities c;
CITY LONGITUDE LATITUDE
------------------------------ ---------- ----------
New York -73.943849 40.6698
Los Angeles -118.4112 34.112101
....
Sioux Falls -96.7301 43.544201
Simi Valley -118.7513 34.26305
195 rows selected.
对于其他几何图形(线条等),则需要通过文本序列化进行传递。