数据处理
数据处理的本质是:针对不同需求,读取并标准化数据集后,施加不同的变换组合
shell-Unix 管道也有缺点——只能进行线性的流水线排布
SQL-关系型数据库是数据处理系统的集大成者。
spark
数据集和算子
一层层细化
数据库基本组件
对于一个数据库来说, 解析器——Parser,计划生成——Planner,计划执行——Runtime。还有对外提供的接口—— SQL 以及对测试用例的覆盖
Parser 就是进行语法解析,将 SQL 语句进行分词,组织成语法树——AST。
Parser 需要支持大部分 Postgres SQL 方言,包括 DDL、DML、DCL 和 DQL
Planner 就是将 AST 基于规则和代价等进行优化成一个可以执行的算子树
LogicPlanner 需要支持现代数仓的重要规则,如谓词下推、子查询去关联
PhysicalPlanner 需要支持对基于代价的连接调序(cost-based join reordering)
PhysicalPlanner 需要支持自定义的统计信息收集和代价模型
Runtime
有两种实现流派——向量化(vectorization)和代码生成(code generation
Runtime 和存储引擎耦合性较高,因此项目最好同时实现了高效的列存引擎
属于拉( pull-based )流派的执行方式。其基本概念就是以树形的方式组织算子,并从根节点开始,自上而下的进行递归调用,
算子间自下而上的以行(row)或者批(batch)的粒度返回数据
基于推(push-based)的流派渐渐火起来了,
DuckDB、Velox 都属于此流派。类似于将递归转化为迭代,自下而上,从叶子节点进行计算,然后推给父亲节点,直到根节点
Duckdb应用
Duckdb,很适合AI量化的一个基于本地文件系统的的olap分析引擎
关键优势在于数据控制的保留。当处理需要保持在组织内部或具有最高机密性的个人文件时,这个功能尤为重要,消除了通过第三方渠道传输信息的需求
duckdb可以轻松访问多个csv和parquet文件,作为本地的分析引擎很好用。
duckdb特别神奇的地方,可以对这多个文件夹下面的csv进行查询
###示例
import duckdb
import pandas
DATA_DIR_CSVS= r"csvs/*/"
df = duckdb.query(
"""
select symbol,date,close from '{}/*.csv'
where date = '20230809'
""".format(DATA_DIR_CSVS)
)
print(df.df())
版本
duckdb D:\Tools\annot.duckdb
duckdb D:\Tools\duckdb\mytest.db
duckdb D:\Tools\duckdb_cli\data\mytest.db
duckdb.IOException: IO Error: Trying to read a database file with version number 51, but we can only read version 43.
代码示例
#! /usr/bin/python3
# -*- coding:utf-8 -*-
#! /usr/bin/python3
# -*- coding:utf-8 -*-
import duckdb
import os
###DuckDB完整的实现了DB-API 2.0协议。因此可以像一般连接数据库一样连接DuckDB
if __name__ =="__main__":
# 创建DB(嵌入式DBMS)
duckdb.sql("select 2").show()
conn = duckdb.connect(r"D:\Tools\annot.duckdb")
# D:\Tools\duckdb\mytest.db D:\annotation\annot.duckdb D:\Tools\duckdb_cli\data
# conn.cursor([cursorclass]):返回一个指针对象,用于访问和操作数据库中的数据。
c = conn.cursor()
meta_cmd = "select * from information_schema.schemata"
print(c.execute(meta_cmd))
# loda_data -创建表
# sql_cmd = ("CREATE TABLE {0} AS SELECT * FROM read_json('{1}',auto_detect=true,json_format='auto',"
# "maximum_object_size=999777216);").format(table_nm,src_data)
# c.execute(sql_cmd)
## 执行 DML(插入、更新、删除)操作时,需要使用 commit() 方法提交事务。执行完成之后再关闭 Cursor 对象
###conn.begin():用于开始一个事务,如果数据库的autocommit已经开启就关闭它,直到事务调用commit()和rollback()结束
### conn.commit() conn.rollback() 分别表示事务提交和回退
## 提交事务
## conn.commit()
## 关闭 Cursor 对象
## cursor.close()
## cursor.fetchall():可取出指针结果集中的所有行,返回的结果集一个元组(tuples)。
## cursor.execute(query[,parameters]):执行一个数据库查询或者命令
conn.close()
参考
https://www.tutorialspoint.com/data_science/data_science_tools_in_demand.htm
https://www.bairesdev.com/blog/data-why-you-should-dive-into-duckdb/
Database Inside 系列 ——SQL 是如何执行的 https://zhuanlan.zhihu.com/p/583791689
标签:##,数据库,Duckdb,duckdb,SQL,data,conn
From: https://www.cnblogs.com/ytwang/p/17746643.html