Saya ingin menggunakan pyarrow untuk membaca/meminta data parket dari server lain. Saat ini saya sedang memotong data, mengonversi ke panda, membuang ke json, dan mengalirkan potongan. Suka:

p = pq.ParquetDataset('/path/to/data.parquet', filters=filter, use_legacy_dataset=False)
batches = p._dataset.to_batches(filter=p._filter_expression)
(json.dumps(b.to_pandas().values.tolist()) for b in batches)

Ini secara efektif adalah pekerjaan yang sama dengan

ds = pq.ParquetDataset('/path/to/data.parquet',
                       use_legacy_dataset=False,
                       filters=filters)
df = ds.read().to_pandas()
data = pd.DataFrame(orjson.loads(orjson.dumps(df.values.tolist())))

Tanpa jaringan io. Ini sekitar 50x lebih lambat daripada hanya membaca panda secara langsung

df = ds.read().to_pandas()

Apakah ada cara untuk membuat serial dataset parket ke beberapa string biner yang dapat saya kirim melalui http dan parsing di sisi klien?

0
postelrich 20 November 2020, 04:51

1 menjawab

Jawaban Terbaik

Anda dapat mengirim data Anda menggunakan panah dalam format kolom memori. Ini akan jauh lebih efisien dan kompak daripada json. tetapi perlu diingat itu akan menjadi data biner (yang tidak seperti json tidak dapat dibaca manusia)

Lihat doc untuk contoh lengkapnya.

Dalam kasus Anda, Anda ingin melakukan sesuatu seperti ini:

ds = pq.ParquetDataset('/path/to/data.parquet',
                       use_legacy_dataset=False,
                       filters=filters)
table = ds.read()  # pa.Table

# Write the data:
batches = table.to_batches()
sink = pa.BufferOutputStream()
writer = pa.ipc.new_stream(sink, table.schema)
for batch in batches:
    writer.write(batch)
writer.close()
buf = sink.getvalue()

# Read the data:
reader = pa.ipc.open_stream(buf)
read_batches = [b for b in reader]
read_table = pa.Table.from_batches(read_batches)

read_table.to_pandas()


1
0x26res 24 November 2020, 17:40