使用 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.

对于其他几何图形(线条等),则需要通过文本序列化进行传递。