我正在尝试使用NiFi将数据从Oracle Database(12+)迁移到HDFS。处理器“ QueryDatabaseTable”和“ ExecuteSQL”似乎无法处理几何数据类型(SDO_GEOMETRY)。
我遇到了错误 “未知的SQL Type 2002,无法转换为Avro类型”
当使用“ sdo_util.to_wktgeometry()”功能将数据类型转换为长字符串时,似乎没有可能。对于第一个处理器,第二个给出错误: “ SDO_UTIL.TO_WKTGEOMETRY()非法字符”
有人通过NiFi从Oracle(12+)迁移Geometry数据类型的技巧吗?线串已经足够了来自“几何对象”的信息(目前)
答案 0 :(得分:1)
我想象NiFi不知道如何处理关系数据库中定义的任何类型的对象类型。显然,对复杂类型(如空间类型)的理解要少得多。即使它确实了解对象类型,您也将难以使用,因为它将暴露类型的内部,并且您需要深入检查Oracle手册以解码内容才能使用信息。
最简单的方法肯定是以序列化的字符串或二进制表示法获取空间类型。您可以在多个符号之间进行选择,也可以选择两种方法来获取它们:
使用对象类型方法:
重要提示:请注意,您必须使用表别名才能调用对象方法!
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坐标。再次注意使用别名。
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.
对于其他几何形状(线等),则需要通过文本序列化。