SQL_Duckdb-数据库一些介绍

发布时间 2023-10-07 16:39:49作者: 辰令

数据处理

数据处理的本质是:针对不同需求,读取并标准化数据集后,施加不同的变换组合
   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