Записывать данные постепенно в файл паркета - PullRequest
0 голосов
/ 09 февраля 2019

Чтобы записать данные из кадра данных pandas в паркет, я делаю следующее:

df = pd.DataFrame(DATA)
table = pa.Table.from_pandas(df)
pq.write_table(table, 'DATA.parquet')

Однако, это не очень хорошо работает, если у меня есть, скажем, строки 1B, и оно не помещается в памяти.В таком случае, как бы я записал данные постепенно.Например, что-то вроде:

DATA = []
BACTCH_SIZE = 10000
with open('largefile.csv') as f:
    for num, line in enumerate(f):
        if (len(DATA) == BATCH_SIZE):
            pq.write_table(pa.Table.from_pandas(pd.DataFrame(DATA)), 'DATA.parquet')
            DATA = []
        DATA.append(line.split(','))

if DATA: pq.write_table(pa.Table.from_pandas(pd.DataFrame(DATA)), 'DATA.parquet')

Тем не менее, я считаю, что вышеприведенное просто перезаписывает файл паркета.Как я могу сделать эквивалент добавления?

1 Ответ

0 голосов
/ 09 февраля 2019

Hadoop не предназначен для добавления.Просто записывайте новые файлы для каждой партии в один каталог, и почти все API Hadoop должны иметь возможность читать все файлы паркета

BACTCH_SIZE = 10000
c = 0
with open('largefile.csv') as f:
    for num, line in enumerate(f):
        if len(DATA) == BATCH_SIZE:
            pq.write_table(pa.Table.from_pandas(pd.DataFrame(DATA)), 'DATA.{}.parquet'.format(c))
            DATA = []
            c += 1
        DATA.append(line.split(','))

Так Spark будет также записывать данные;один файл на исполнителя

Но если у вас в любом случае был большой CSV, просто поместите его в HDFS, затем создайте над ним таблицу Hive, а затем конвертируйте ее в паркет.Нет нужды в пандах

...