Как эффективно разделить большой фрейм данных на множество паркетных файлов? - PullRequest
0 голосов
/ 12 июня 2018

Рассмотрим следующий фрейм данных

import pandas as pd
import numpy as np
import pyarrow.parquet as pq
import pyarrow as pa

idx = pd.date_range('2017-01-01 12:00:00.000', '2017-03-01 12:00:00.000', freq = 'T')

dataframe = pd.DataFrame({'numeric_col' : np.random.rand(len(idx)),
                          'string_col' : pd.util.testing.rands_array(8,len(idx))},
                           index = idx)

dataframe
Out[30]: 
                     numeric_col string_col
2017-01-01 12:00:00       0.4069   wWw62tq6
2017-01-01 12:01:00       0.2050   SleB4f6K
2017-01-01 12:02:00       0.5180   cXBvEXdh
2017-01-01 12:03:00       0.3069   r9kYsJQC
2017-01-01 12:04:00       0.3571   F2JjUGgO
2017-01-01 12:05:00       0.3170   8FPC4Pgz
2017-01-01 12:06:00       0.9454   ybeNnZGV
2017-01-01 12:07:00       0.3353   zSLtYPWF
2017-01-01 12:08:00       0.8510   tDZJrdMM
2017-01-01 12:09:00       0.4948   S1Rm2Sqb
2017-01-01 12:10:00       0.0279   TKtmys86
2017-01-01 12:11:00       0.5709   ww0Pe1cf
2017-01-01 12:12:00       0.8274   b07wKPsR
2017-01-01 12:13:00       0.3848   9vKTq3M3
2017-01-01 12:14:00       0.6579   crYxFvlI
2017-01-01 12:15:00       0.6568   yGUnCW6n

Мне нужно записать этот фрейм данных во многие файлы паркета.Конечно, работает следующее:

table = pa.Table.from_pandas(dataframe)
pq.write_table(table, '\\\\mypath\\dataframe.parquet', flavor ='spark')

Моя проблема в том, что полученный (одиночный) файл parquet становится слишком большим.

Как я могу эффективно (по памяти, по скорости) разделить записи на daily файлы паркета (и сохранить аромат spark)?Эти ежедневные файлы будет легче читать параллельно с spark позже.

Спасибо!

Ответы [ 2 ]

0 голосов
/ 13 июня 2018

Решение, представленное Дэвидом, не решает проблему, поскольку генерирует файл паркета для каждого индекса.Но эта небольшая модифицированная версия делает свое дело

import pandas as pd
import numpy as np
import pyarrow.parquet as pq
import pyarrow as pa
idx = pd.date_range('2017-01-01 12:00:00.000', '2017-03-01 12:00:00.000',
                    freq='T')

df = pd.DataFrame({'numeric_col': np.random.rand(len(idx)),
                   'string_col': pd.util.testing.rands_array(8,len(idx))},
                  index = idx)

df["dt"] = df.index
df["dt"] = df["dt"].dt.date
table = pa.Table.from_pandas(df)
pq.write_to_dataset(table, root_path='dataset_name', partition_cols=['dt'], 
                    flavor='spark')
0 голосов
/ 12 июня 2018

Создание строкового столбца dt на основе индекса позволит вам затем вывести данные, разбитые по дате, с помощью команды

pq.write_to_dataset(table, root_path='dataset_name', partition_cols=['dt'], flavor ='spark')

Ответ основан на этом источнике (обратите внимание, источник неправильно указывает аргумент раздела как partition_columns)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...