数据库_DuckDB_数据库应用示例
通用的问题
数据库存储的位置在那里;
数据库的所有者是谁;
其它用户如何来访问这个数据库;
duckdb
DuckDB 是阿姆斯特丹 Centrum Wiskunde&Informatica(CWI)数学和理论计算研究中心的学者们的创意,
它嵌入在一个主机进程中。无需安装、更新或维护 DBMS 服务器软件
程序
DuckDB 的二进制库+头文件
数据文件
.db 以及 .db.wal
结构--Database, Catalog and Schema Tables and Views Rows Columns
file--用户的数据库名称--databasename-database_oid
information_schema pg_catalog main
system
information_schema main pg_catalog
temp
information_schema main pg_catalog
DuckDB 的模块介绍--代码实现
SQL Parser --> Logical Planner --> Optimizer --> Physical Planner --> Execution Engine
Transaction and Concurrency Control
Storage
###概念
1.information_schema.schemat
schema_name Name of the schema. VARCHAR 'main'
2.pg_catalog
standard PostgreSQL pg_catalog functions and views for compatibility with PostgreSQL database and SQL syntax
3.main
表 视图 索引 存储过程 数据类型 函数 扩展 保留关键字
duckdb一些主要的概念词
databases, schemas,
indexes, sequences, extensions, functions, types, configuration settings, and reserved keywords
information_schema.tables
The schema the table or view belongs to. VARCHAR 'main'
驱动:
duckdb_jdbc-0.9.2.jar
工作方式
DuckDB 支持内存型和持久化型两种工作模式
内存型不持久化数据,采用 InMemoryBlockManager 来管理数据
持久化型数据 采用 SingleFileBlockManager 来管理外存上的数据
从命令行中学习-SQL环境下Catalog和Schema都属于抽象概念
数据库--databasename-database_oid
current database
数据库 schema含义数据库Schema有两种含义,
一种是概念上的Schema,指的是一组DDL语句集,该语句集完整地描述了数据库的结构。
还有一种是物理上的 Schema,指的是数据库中的一个名字空间
current_schemas(true) ['temp', 'main', 'pg_catalog']
Catalog Schema User
user username password
1.Cluster > Catalog > Schema > Table > Columns & Rows
So in both Postgres and the SQL Standard we have this containment hierarchy:
A computer may have one cluster or multiple.
A database server is a cluster.
A cluster has catalogs. ( Catalog = Database )
Catalogs have schemas. (Schema = namespace of tables, and security boundary)
Schemas have tables.
Tables have rows.
Rows have values, defined by columns.
2.PostgreSQL中内建了对表常规访问的支持,
但是所有的索引方法则是在pg_am中描述
3.Constraints,是限制、约束
constraint_type 约束类型 CHECK, FOREIGN KEY, PRIMARY KEY, NOT NULL, UNIQUE.
CHECK约束 是指约束表中某一个或者某些列中可接受的数据值或者数据格式
唯一约束
5种完整性约束:
1)NOT NULL: 指定某列不能为空
2)UNIQUE: 指定某列或某几列不能重复
3)PRIMARY KEY: 指定该列的值可以唯一地标识该条记录
4)FOREIGN KEY: 指定该行记录从属于主表中的一条记录,主要用于保证参照完整性
5)CHECK: 指定一个布尔表达式,用于指定对应列的值必须满足该表达式
【mysql不支持check】
2类约束:采用列级约束语法或者表级约束语法
1)单列约束:
2)多列约束:
指定约束的时机:
1)建表的同时为相应的数据列指定约束
2)建表后创建,以修改表的方式来增加约束(用alter来修改)
select * from duckdb_settings();
select *from duckdb_keywords();
select * from duckdb_databases();
select * from duckdb_schemas();
select * from duckdb_functions()
select * from duckdb_tables()
select * from duckdb_views();
select * from duckdb_indexes();
select * from duckdb_columns();
select * from duckdb_types()
select * from duckdb_constraints();
select * from duckdb_sequences();
select * from duckdb_extensions();
select * from duckdb_optimizers();
其他类似的数据库
MySQL初始化完成后会创建出4个系统库,
分别是information_schema、performance_schema、mysql、sys
infomation_schema 提供数据库的元数据,比如数据库名、表名、索引等,可以当作字典表
mysql 是 mysql的核心库,主要存储数据库用户、权限等 mysql 自身需要使用的信息
performance_schema 用于收集数据库服务器的性能数据,以便分析问题。比如 SQL 的执行次数、耗时、锁等信息
postgres 刚初始化的集群中,默认有一个数据库 postgres,有一个超级管理员用户,默为当前系统的用户
初始化数据库后默认的表空间有pg_default、pg_global
SQLite的默认库是一个空数据库,SQLite 在创建数据库时创建架构表
每个 SQLite 数据库都包含一个 "schema table" ,用于存储该数据库的架构。
数据库的架构是对数据库中包含的所有其他表、索引、触发器和视图的描述
main.sqlite_schema " 或 "temp.sqlite_schema"
SQLite 数据库都有一个叫 SQLITE_MASTER 的表,
里面存储着数据库的数据结构(表结构、视图结构、索引结构等),只可以对它使用查询语句
sqlite_schema 替代名称也被认可,包括: sqlite_master sqlite_temp_schema sqlite_temp_master
数据导入
import duckdb
import os
if __name__=="__main__":
csv_dir = r"~/duckdb_exp"
file_nm = r"roadline.csv"
## dbeaver中 duckdb 可以不导入到数据库中,就可以直接查询<前提是已经安装好debeaver 以及duckdb 以及dbeaver的duckdb驱动>
## dbeaver “新建 SQL 编辑器”,这样我们就可以在里面写 SQL 语句
## 直接可以查询出数据结果,而不需要像一般数据库需要先建表、导入数据后才能查询
## select num,sum(pcd_cnt) from "~/duckdb_exp/road.csv" group by num
input_csv_file = os.path.join(csv_dir,file_nm)
# 如果一张表我们要经常查询还是需要将其导入到数据库
out_file_db = os.path.join(csv_dir,'file.db')
if not os.path.exists(out_file_db):
table_nm = "road_info"
conn = duckdb.connect(out_file_db)
c = conn.cursor()
sql_cmd = ("CREATE TABLE {0} AS SELECT * FROM read_csv_auto('{1}') ").format(table_nm,input_csv_file)
## sample_size=-1,这样可以参数数据中的所有行,来创建适当的数据类型。
c.execute(sql_cmd)
conn.close()
参考
duckdb从入门到精通:数据导入 https://zhuanlan.zhihu.com/p/627565479
和pandas一起使用
import pandas as pd
import duckdb
import os
if __name__ =="__main__":
root_dir = r"/data/orig_stat_src"
class_grade_task = os.path.join(root_dir,r"class_grade_task.txt")
##data01
task_id = pd.read_csv(class_grade_task,sep="\t")
task_id['ori_grade_nm'] = task_id["grade_nm"].str[:-4]
print(task_id.head())
##data02
grade_path = os.path.join(root_dir,"grade_path.txt")
grade_path_df = pd.read_csv(grade_path,sep="\t")
grade_path_df['ori_grade_nm'] = grade_path_df["grade_path"].str.split("/").str[-1].str.replace("grade_","").str.replace("cor","corr").str[:-4]
print(grade_path_df.head())
#grade_path_df['ori_grade_nm'].to_csv("/data/test.txt",index=None)
#####data03
info_1_df =pd.merge(task_id, grade_path_df, how = 'left', on = "ori_grade_nm")
### duckdb
data = duckdb.query('select task_id,max(task_nm) as task_nm, sum(json_cnt), sum(obj_cnt) from info_1_df group by task_id').df()
print(data)
数仓
内核引擎--应用侧与业务层。
大多数数据库都是为客户端-服务器用例设计的-因此不适合本地交互式查询
Client-Server架构的分析型数据库在整个用户体验过程中的普遍弊病:繁琐的部署安装过程、硬件资源消耗、冗长的数据导入导出
DuckDB以SQL作为查询语言,并采用Postgre方言:不区分大小写、区分单引号双引号、命令句尾带分号等
select * from duckdb_schemas();
CREATE SCHEMA IF NOT EXISTS sche2;
CREATE TABLE sche2.t(id INTEGER PRIMARY KEY, other_id INTEGER);
select * from duckdb_schemas();
by column position and by column name.
-- read a set of CSV files combining columns by position
SELECT * FROM read_csv('flights*.csv');
-- read a set of CSV files combining columns by name
SELECT * FROM read_csv('flights*.csv', union_by_name = true);
Source→ELT→Storage→Compute→Application这整个核心业务流
Duck选择解放本地计算机的算力--面向小体量的数据、面向解放Client端的计算资源
01.对外部文件的支持-import 云上云下协同
支持免建表、直接读写本地的CSV、JSON、EXCEL文件外
远程文件的访问也支持跨文件JOIN httpfs、parquet扩展支持http、https、s3协议和parquet格式文件的读写
02.command line DuckDB WASM DuckDB的WASM版功能
单个文件的形式进行存储
DuckDB CLI和Python Client 以及Web UI Client
DuckDB Labs--》MotherDuck
03.身份管理、认证授权、监控审计等安全类功能 提供云端的非易失性存储 容灾备份等企业级功能
Serverless方式-DuckDB的能力从Client扩展至Cloud
并发-线程池等--分析型并发数要求没有这么高?
AI支持
静候下一个范式的转变
信息学院博士生金国栋 基于开源列存数据库系统DuckDB,我们实现了图-关系数据库原型系统GRainDB
操作系统
大型机时代、PC主导的互联网时代,以及智能手机主导的移动互联网时代--万物互联时代
以鸿蒙为例
内核层、系统服务层、框架层和应用层
1.微内核架构
LiteIPC是 OpenHarmony LiteOS-A内核提供的一种新型IPC(Inter-Process Communication,即进程间通信)机制
LiteIPC主要是为RPC(Remote Procedure Call,即远程过程调用)而设计的,而且是通过设备文件的方式对上层提供接口的,而非传统的API函数方式
主要概念,一个是ServiceManager,另一个是Service。整个系统只能有一个ServiceManager,而Service可以有多个。
System V IPC机制,
AT&T的贝尔实验室和加州大学伯克利分校(BSD)。
在通信方面,
AT&T的贝尔实验室主要对单个计算机内的进程通信机制进行了改进和扩充,形成了System V IPC;
加州大学伯克利分校(BSD则主要在计算机间,基于嵌套字(socket)的进程间通信机制方面做出了重要贡献。
内核抽象层(KAL,Kernel Abstract Layer)通过屏蔽多内核差异
2.统一的设备驱动框架--统一多端设备
OpenHarmony 系统驱动开发,OpenHarmony 系统 HDF 驱动框架支持多种驱动加载方式:
HDF 驱动框架主要由驱动基础框架、驱动程序、驱动配置文件和驱动接口这四个部分组成。
提供统一外设访问能力和驱动开发、管理框架。
3.鸿蒙分布式架构-分布式软总线-分布式数据管理-分布式任务调度-设备虚拟化
设备间的发现和连接:从手动发现,进化成自发现
多设备互联后的组网技术:软总线组网-异构网络组网
多设备多协议间的高效传输技术
通过轻量级的 IPC(Inter Process Communication,进程间通信)机制进行通信,实现了更加灵活、可定制化的系统设计
管理设备认证、组网、通信
4.强大的编译工具链
用户程序框架、Ability框架以及UI框架,多终端软件平台API具备一致
5. 包括系统级安全、应用级安全和网络安全等方
附录
IPC socket
RPC(Remote Procedure Call)
gRPC是Google公布的开源软件,基于最新的HTTP2.0协议,并支持常见的众多编程语言
Dubbo是阿里集团开源的一个极为出名的RPC框架
构成
RPC中很重要的一个部分是序列化与反序列化,主流的序列化方法包括xml,json,protobuf和msgpack
数据库范式--数据库也将迎来演化的时代
文件操作阶段--存储目录--》存储位置和格式
单机模式--联机模式--联机的集群 --云上云下协同
联机模式:缓存
联机的集群: 主从复制和读写分离
本地--浏览器 服务端 --客户端 服务端
数据库、数据库管理系统、数据库应用程序三者结合起来构成数据库系统(Database System)
存储数据库并运行DBMS的计算机叫数据库服务器
开发数据库- 开发以及生产调优
数据库 设计人员-- 数据库模式 设计、实现、部署的
数据库 系统管理人员DBA -数据库系统监测与维护,数据库安全保障,备份与恢复
数据库 应用程序开发人员
终端用户
参考
https://db-engines.com/en/ranking
https://www.linkedin.com/pulse/%E4%B8%87%E5%AD%97%E8%A7%A3%E8%AF%BB-a%E8%BD%AE%E5%B0%B1%E8%9E%8D%E8%B5%843%E4%BA%BF%E7%9A%84motherduck%E5%88%B0%E5%BA%95%E6%98%AF%E4%B8%AA%E5%95%A5-rachel-law
https://graindb.github.io/
https://github.com/graindb/graindb
写规则引擎
RandomFractals duckdb-sql-tools https://github.com/RandomFractals/duckdb-sql-tools/discussions
https://github.com/RandomFractals
https://livebook.manning.com/book/duckdb-in-action/welcome/v-4/
https://github.com/duckdb-in-action/examples/tree/main/ch03
数据库 schema与catalog https://www.cnblogs.com/ECNB/p/4611309.html
https://stackoverflow.com/questions/7022755/whats-the-difference-between-a-catalog-and-a-schema-in-a-relational-database
分类:
SQL_数据仓库
, Python_Java_数据开发
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 如何使用 Uni-app 实现视频聊天(源码,支持安卓、iOS)
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)