如何直接从Python字典创建DuckDBPyRelation(无需借助pandas/PyArrow等库)
如何直接从Python字典创建DuckDBPyRelation(无需借助pandas/PyArrow等库)
当然可以!不用绕路经过pandas或者PyArrow,DuckDB的Python API本身就支持直接从字典生成关系对象,给你两种实用的方法:
方法一:使用duckdb.from_dict()(推荐)
这是最直接高效的方式,和你用Polars/pandas创建DataFrame的逻辑几乎一致,DuckDB会自动推断列的数据类型:
import duckdb # 定义你的数据字典 my_data = {'a': [1, 2, 3], 'b': [4, 5, 6]} # 直接转换为DuckDBPyRelation rel = duckdb.from_dict(my_data) # 查看结果 rel.show()
执行后你会得到类似这样的输出:
┌───────┬───────┐ │ a │ b │ │ int64 │ int64 │ ├───────┼───────┤ │ 1 │ 4 │ │ 2 │ 5 │ │ 3 │ 6 │ └───────┴───────┘
生成的rel就是标准的DuckDBPyRelation对象,你可以直接对它执行各种SQL操作,比如过滤、聚合之类的:
# 示例:过滤a大于1的行 filtered_rel = rel.filter("a > 1") filtered_rel.show()
方法二:构造VALUES子句查询(适合小数据集)
如果是小体量的数据,你也可以手动构造SQL的VALUES子句来生成关系对象:
import duckdb my_data = {'a': [1, 2, 3], 'b': [4, 5, 6]} # 把字典里的行数据拼接成VALUES需要的格式 rows = ", ".join([f"({val_a}, {val_b})" for val_a, val_b in zip(my_data['a'], my_data['b'])]) # 构造查询语句 query = f"SELECT * FROM (VALUES {rows}) AS temp_table(a, b)" # 执行查询得到关系对象 rel = duckdb.sql(query) rel.show()
这种方法灵活性强,但数据量大的时候不如第一种方法方便,所以更适合快速测试小数据集的场景。
备注:内容来源于stack exchange,提问作者ignoring_gravity
相关产品推荐
相关产品推荐

