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, не перечисленные выше, не будут преобразованы и будут удалены.