将数据增量地写入镶木地板文件

时间:2019-02-09 01:56:58

标签: python hadoop parquet

要从熊猫数据框写入实木复合地板,我需要执行以下操作:

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 :(得分:3)

Hadoop并非用于附加。只需将每批新文件写入一个目录,几乎所有Hadoop API都应该能够读取所有实木复合地板文件

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表,然后从那里将其转换为镶木地板即可。完全不需要熊猫