我正在尝试将一行大小组= 10的拼图文件以块的形式加载到duckdb表中。我找不到任何文件来支持这一点。
这是我的工作,等等:参见代码
import duckdb
import pandas as pd
import gc
import numpy as np
# connect to an in-memory database
con = duckdb.connect(database='database.duckdb', read_only=False)
df1 = pd.read_parquet("file1.parquet")
df2 = pd.read_parquet("file2.parquet")
# create the table "my_table" from the DataFrame "df1"
con.execute("CREATE TABLE table1 AS SELECT * FROM df1")
# create the table "my_table" from the DataFrame "df2"
con.execute("CREATE TABLE table2 AS SELECT * FROM df2")
con.close()
gc.collect()
请帮助我加载这两个表与拼花文件行组大小或块。ALso,将数据作为块加载到duckdb中。
发布于 2022-10-22 12:04:24
df1 = pd.read_parquet("file1.parquet")
此语句将将整个拼花文件读入内存中。相反,我假设您希望以块(即一个接一个的行组或分批读取)进行读取,然后将数据帧写入DuckDB中。
这是不可能的,到目前为止,使用熊猫。您可以使用像pyarrow (或快速拼板)这样的方法来完成这一任务。下面是来自皮亚罗文档的一个示例。
iter_batches可用于从Parquet文件读取流批。这可以用于分批读取、读取某些行组甚至某些列。
import pyarrow.parquet as pq
parquet_file = pq.ParquetFile('example.parquet')
for i in parquet_file.iter_batches(batch_size=10):
print("RecordBatch")
print(i.to_pandas())
上面的例子只是一次读取10条记录。您可以将其进一步限制为某些行组,甚至某些列,如下面所示。
for i in parquet_file.iter_batches(batch_size=10, columns=['user_address'], row_groups=[0,2,3]):
希望这能有所帮助!
发布于 2022-10-24 16:37:17
这不一定是一个解决方案(我喜欢已经提交的面向py箭头的解决方案!),但是下面是一些可能帮助您的其他信息。我正试图猜测你的根本原因是什么!(https://xyproblem.info/)
在DuckDB的下一个版本中(以及在当前的主分支上),数据将以流式方式写入磁盘以供插入。这应该允许您在不耗尽内存的情况下将任何大小的Parquet文件插入到文件支持的持久DuckDB中。希望它完全消除了您进行批处理的需要(因为DuckDB将根据您的行组自动批处理)!例如:
con.execute("CREATE TABLE table1 AS SELECT * FROM 'file1.parquet'")
另一个注意事项是,通常建议的行组大小接近100,000或1,000,000行。这与非常小的行组相比有一些好处。压缩将更好地工作,因为压缩只在行组内运行。存储统计信息的开销也会减少,因为每个行组都存储自己的统计信息。而且,由于DuckDB相当快,它将非常快地处理一个100,000,000行行组(而读取统计数据的开销可能会在非常小的行组中减慢)。
https://stackoverflow.com/questions/74152013
复制相似问题