要从熊猫数据框写入实木复合地板,我需要执行以下操作:
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')
但是,我相信以上内容将继续覆盖镶木地板文件。我该怎么做相当于追加?
答案 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表,然后从那里将其转换为镶木地板即可。完全不需要熊猫