Импорт пространственных данных из Oracle (12+) в HDFS с помощью NiFi

Я пытаюсь перенести данные из базы данных Oracle (12+) с NiFi в HDFS. Процессоры «QueryDatabaseTable» и «ExecuteSQL», похоже, не могут обрабатывать геометрический тип данных (SDO_GEOMETRY).

Я получаю сообщение об ошибке «Неизвестный тип SQL 2002, не может быть преобразован в тип avro»

При альтернативном преобразовании типа данных в длинную строку с помощью функции "sdo_util.to_wktgeometry ()", похоже, это невозможно, соответственно. для первого процессора, а второй выдает ошибку: «SDO_UTIL.TO_WKTGEOMETRY () недопустимый символ»

Есть ли у кого-нибудь советы по переносу типов данных Geometry из Oracle (12+) с помощью NiFi? Строка - это достаточно информации от объекта Geometry (пока)


person Tosca van Meer    schedule 04.10.2018    source источник


Ответы (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.

Для других геометрий (линий и т. Д.) Вам необходимо пройти через сериализацию текста.

person Albert Godfrind    schedule 26.10.2018
comment
Спасибо за подробный ответ. Для меня проблема заключалась в том, что я забыл псевдонимы, но в итоге узнал гораздо больше благодаря вашему комментарию! - person Tosca van Meer; 19.11.2018
comment
Рад, что мне помогли. Может ты хочешь проголосовать за мой ответ? :-) - person Albert Godfrind; 23.11.2018