Apache Arrow в ArcGIS

Apache Arrow - это кросс-платформенное, кросс-языковое, табличное представление данных в памяти с открытым исходным кодом, которое позволяет эффективно передавать данные между ресурсами. Многие проекты с большими данными работают с Arrow, что делает его удобным вариантом чтения и записи табличных файловых форматов без привязки к языку и платформе. Дополнительные сведения см. в документации к Apache Arrow, где имеются примеры использования и представлены проекты и продукты, использующие Apache Arrow.

Основное представление табличных данных в Arrow - это таблица Arrow. Таблица Arrow – это двухмерное табличное представление, в котором столбцы являются разделенными массивами Arrow. Интерфейсом для Arrow в Python является PyArrow. Дополнительные сведения см. в документации Apache Arrow и библиотека PyArrow.

Таблицы и данные пространственных объектов

Вы можете преобразовывать таблицы и классы объектов в таблицу Arrow, используя функцию TableToArrowTable в модуле доступа к данным (arcpy.da).

Создать таблицу Arrow из класса пространственных объектов.

import arcpy

infc = r'C:\data\usa.gdb\cities'
arrow_table = arcpy.da.TableToArrowTable(infc)

Чтобы преобразовать таблицу Arrow в таблицу или класс объектов, используйте инструмент Копировать строки или Копировать объекты.

Создать класс пространственных объектов из таблицы Arrow.

outfc = arcpy.management.CopyFeatures(arrow_table, r'C:\data\usa.gdb\cities_new')

Таблицы Arrow можно использовать в качестве входных данных для любого инструмента геообработки, который принимает на входе таблицу или класс объектов, за исключением таких инструментов, меняющих входные данные, как Вычислить поле. Хотя инструмент геообработки может принимать на входе таблицу Arrow в качестве входных данных, на выходе будет не таблица Arrow, а таблица или класс объектов.

Схема

Таблицы Arrow должны следовать определенной схеме, чтобы их можно было распознать инструментом геообработки. Схема состоит из имен полей, их типов данных и сопутствующих метаданных. Метаданные хранятся в виде объекта в кодировке JSON.

Поле идентификатора объекта должно иметь тип данных PyArrow int64 со следующей парой метаданных ключ/значение:

{
    'esri.oid': 'esri.int64'
}

Пример определения поля, содержащего идентификаторы объектов.

pyarrow.field(
    "OBJECTID",
    pyarrow.int64(),
    metadata={'esri.oid': 'esri.int64'}
)

Столбец геометрии должен иметь тип данных PyArrow binary или string, в зависимости от кодировки данных геометрии. Кодировка геометрии указана в метаданных под ключом esri.encoding. Список поддерживаемых кодировок геометрии:

  • EsriShape и Well Known Binary (WKB) для binary полей
  • EsriJSON, GeoJSON Well Known Text (WKT) для string полей

Кроме того, система координат для геометрии должна быть указана с помощью ключа esri.sr_wkt, для которого значение должно быть строкой системы координат WKT. Если система координат неизвестна, оставьте строку пустой. Общая структура метаданных выглядит следующим образом:

{
    'esri.encoding': '<EsriShape, EsriJSON, GeoJSON, WKB, or WKT>',
    'esri.sr_wkt': '<a WKT coordinate system string>'
}

Пример определения поля геометрии, содержащего бинарную геометрию Esri Shape с пространственной привязкой GCS North American 1983.

f = pyarrow.field(
    "SHAPE",
    pyarrow.binary(),
    metadata={
        'esri.encoding': 'EsriShape',
        'esri.sr_wkt': 'GEOGCS["GCS_North_American_1983",DATUM["D_North_American_1983",' \
        'SPHEROID["GRS_1980",6378137.0,298.257222101]],PRIMEM["Greenwich",0.0],'         \
        'UNIT["Degree",0.0174532925199433]];-400 -400 1000000000;-100000 10000;'         \
        '-100000 10000;8.98315284119521E-09;0.001;0.001;IsHighPrecision'
    }
)

При использовании таблицы Arrow в качестве входных данных для инструмента геообработки, для которого требуется класс пространственных объектов или векторный слой, необходимо правильно указать столбец геометрии, чтобы инструменты геообработки могли распознавать данные геометрии. Если он не указан должным образом, инструмент не работает. В особом случае, когда геометрия имеет тип EsriShape, ключ esri.encoding можно не указывать. Хотя поддерживаются различные форматы геометрии, EsriShape рекомендуется для передачи геометрии без потерь и с максимальной производительностью. Поле Object ID не является обязательным. Поскольку уникальность значений столбцов в таблице Arrow не гарантируется, любые существующие значения поля Object ID будут перезаписаны новыми идентификаторами, когда таблица будет использоваться инструментом геообработки. Если в таблице Arrow нет поля Object ID, поле Object ID будет создано автоматически во время геообработки. Чтобы просмотреть текущую схему таблицы Arrow, используйте свойство schema таблицы.

Вы можете использовать знание схемы, чтобы собрать таблицу Arrow, совместимую с инструментами геообработки, или, при необходимости, адаптировать существующие данные из внешних источников для использования с инструментами геообработки.

Создайте таблицу Arrow с нуля и преобразуйте ее в таблицу базы геоданных.

import arcpy
import pyarrow as pa

# Get spatial reference
sr = arcpy.SpatialReference(3857)  #WGS 1984 Web Mercator (auxiliary sphere)

# Specify fields for schema
fields = [

    pa.field("SHAPE", pa.string(), metadata={'esri.encoding': 'WKT', 'esri.sr_wkt': sr.exportToString()}),
    pa.field('NAME', pa.string()),
    pa.field('STATE', pa.string()),
    pa.field('POP2010', pa.int32()),
]
# Specify data (smallest and largest major US city)
arrays = [

    pa.array([
        'POINT (-8238770.1834999993 4969744.1656000018)', 
        'POINT (-8078649.3640999999 5506675.5481000021)',
    ]),
    pa.array(['New York City', 'Montpelier']),
    pa.array(['NY', 'VT']),
    pa.array([8175133,  7855]),
]

# Create Arrow table from data and schema
patable = pa.Table.from_arrays(
    arrays=arrays,
    schema=pa.schema(fields)
)

# Convert Arrow table to geodatabase table
cities = arcpy.management.CopyRows(
    patable, r'C:\data\usa.gdb\smallest_largest_city')

Конвертация типов

При преобразовании таблицы или класса пространственных объектов в таблицу Arrow с помощью функции TableToArrowTable типы данных в столбцах созданной таблицы Arrow (объекты pyarrow.ChunkedArray) определяются по типам полей входной таблицы или входного класса объектов. Кроме того, с помощью параметра geometry_encoding можно задать кодировку геометрии в столбце геометрии выходной таблицы Arrow.

Тип поляТип данных PyArrowМетаданные PyArrow

Short

int16

Long

int32

Big Integer

int64

Float

float

Double

double

Text

string

Дата

timestamp[ms]

Только дата

date64[ms]

Только время

time32[ms]

Сдвиг метки времени

string

{b'esri.interop.type': b'esri.timestamp_offset'}

GUID

string

{b'esri.interop.type': b'esri.guid'}

Global ID

string not null

{b'esri.interop.type': b'esri.global_id'}

Object ID

int64

{b'esri.oid': b'esri.int64'}

Blob

binary

b'esri.interop.type': b'esri.blob'

Геометрия

binary или string

{b'esri.encoding': b'EsriShape', b'WKB', b'EsriJSON', b'GeoJSON', or b'WKT'>, b'esri.sr_wkt: b'<Spatial Reference WKT>'}

Другие типы полей, не перечисленные выше, не будут преобразованы и будут удалены.

Примечание:

Текстовые поля обрезаются до 5000 символов при преобразовании в таблицу Arrow.

Примечание:

Поскольку уникальность значений столбцов в таблице Arrow не гарантируется, ответственность за обеспечение уникальности значений, хранящихся в полях глобального идентификатора, лежит на пользователе и базе данных. Используйте настройку среды preserveGlobalIds, чтобы контролировать обработку значений Global ID в целевой базе данных.

При преобразовании таблицы Arrow в таблицу или класс объектов с помощью инструмента геообработки типы полей выходной таблицы или класса объектов определяются типами данных столбцов входной таблицы Arrow. Поле Object ID, если оно отсутствует, будет автоматически добавлено в выходную таблицу или класс объектов.

Тип данных PyArrowМетаданные PyArrowТип поля

bool

Короткое (Small Integer)

int8

Короткое (Small Integer)

int16

Короткое (Small Integer)

int32

Длинное (Integer)

int64

Big Integer

uint8

Короткое (Small Integer)

uint16

Длинное (Integer)

uint32

Big Integer

uint64

Double

float32

С плавающей точкой (Single)

float64

Double

string

Текст (String)

utf8

Текст (String)

timestamp

Дата

date32

Только дата

date64

Только дата

time32

Только время

time64

Только время

int64

b'esri.oid': b'esri.int64'

Object ID

binary

b'esri.interop.type': b'esri.blob'

Blob

binary

{'esri.encoding': <b'EsriShape' or b'WKB'>, b'esri.sr_wkt: b'<Spatial Reference WKT>'}

Геометрия

string

{'esri.encoding': <b'EsriJSON', b'GeoJSON', or b'WKT'>, b'esri.sr_wkt: b'<Spatial Reference WKT>'}

Геометрия

Все типы данных Arrow, не перечисленные выше, не будут преобразованы и будут удалены.