Создать файл геопаркета из большого набора данных порциями в PythonPython

Программы на Python
Ответить
Anonymous
 Создать файл геопаркета из большого набора данных порциями в Python

Сообщение Anonymous »

Я пытаюсь добиться поэтапной записи файлов геопаркета.
В то время как запись файла паркета по частям с помощью pyarrow.RecordBatch тривиальна для фрагментов pandas и также хорошо документирована, делая то же самое, когда создание файла геопаркета с помощью geopandas (или любого другого подхода), похоже, не имеет документации.
На данный момент я сделал следующее:

Код: Выделить всё

import sys
import pathlib
import pyarrow as pa
import pyarrow.parquet as pq
import pandas as pd
import numpy as np
import geopandas as gpd

def create_sample_data(filename: str):
df = pd.DataFrame(np.random.randint(-90, 90, size=(1000000, 3)), columns=list('xyz'))
df.to_csv(filename, sep=' ', header=False, index=False)

def convert_geoparquet(input_file, output_file):
df = pd.read_csv(input_file, header=None, names=['x', 'y', 'z'], sep=' ', dtype='int32')
gdf = gpd.GeoDataFrame(df, geometry=gpd.points_from_xy(df.x, df.y), crs=4326)
gdf.to_parquet(output_file, compression='brotli')

def convert_parquet(input_file, output_file):
new_schema = pa.schema([('x', pa.int32()), ('y', pa.int32()), ('z', pa.int32())])
with pq.ParquetWriter(output_file, schema=new_schema, compression='brotli') as writer:
with pd.read_csv(input_file, header=None, names=['x', 'y', 'z'], sep=' ', dtype='int32', chunksize=1000) as reader:
for i, df in enumerate(reader):
batch = pa.RecordBatch.from_pandas(df, schema=new_schema)
writer.write_batch(batch)

def convert(input_file, conv_type='parquet'):
output_file = f"""{pathlib.Path(input_file).with_suffix('')}.{conv_type}"""
if conv_type == 'parquet':
convert_parquet(input_file, output_file)
elif conv_type == 'geoparquet':
convert_geoparquet(input_file, output_file)
else:
sys.exit(1)

if __name__ == '__main__':
input_file = './testdata.csv'
create_sample_data(input_file)
convert(input_file, 'parquet')
convert(input_file, 'geoparquet')

Я использую Python 3.11, pyarrow 18.1.0, geopandas 1.0.1 и pandas 2.2.3.
И файлы геопаркета, и файлы паркета получают создается легко, однако создание геопаркета, очевидно, происходит намного медленнее, поскольку он читает весь файл, а не выполняет его по частям (помимо других последствий, которые это приносит). Кажется, существует несколько «стандартов» написания геопаркетов, но геопанды кажутся мне наиболее интуитивно понятными.
TLDR:
Есть ли способ реализовать фрагментарный геопаркет создание больших наборов табличных данных?
Заранее спасибо и большое спасибо

Подробнее здесь: https://stackoverflow.com/questions/793 ... -in-python
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»