数据库_使用DuckDB和DuckLake构建 obs对象存储数据湖

数据湖

 数据湖是一种存储系统,底层包括不同的文件格式及湖表格式,可存储大量非结构化和半结构化的原始数据
 数据仓库
 数据仓库和流结合形成了 Streaming Warehouse
 湖仓一体--Lakehouse: Lakehouse 集成了计算框架和 SQL 查询引擎,添加了数据治理能力,支持 Catalog 表管理和先进的作业编排
     湖上建仓   仓外挂湖

1.数据模块

重构采用DuckDB+Parquet结合的方式,计算绕过pandas,
    直接采用duckdb的sql计算,这样性能和效率都会有大幅提升

一是增量查询(Incremental Query)  二是时间旅行(Time Travel) 三是并发(Concurrency)

2.duckdb与数据湖

DuckLake 是一个基于 DuckDB 的轻量级表格式,
 它将元数据存储在 SQL 数据库(如 DuckDB)中,元数据存储在duckdb数据库
 而实际数据则存储在开放格式(如 Parquet)的云存储(如 S3、GCS、Azure Blob Storage)上。 数据以parquet的格式存储在S3

 01.设置S3的情况
    INSTALL httpfs;    
    LOAD httpfs;  
    -- s3 
    SET s3_url_style='path';
	SET s3_use_ssl='false';		
    SET s3_region='cn-east-1'; 
	SET s3_endpoint='obs.cn-east-1.xx.com';
    SET s3_access_key_id='<AWS access key id>';  
    SET s3_secret_access_key='<AWS secret access key>';     
    -- or  
    SET s3_region='cn-east-1';  
    SET s3_session_token='<AWS session token>';
    seletc	* from read_csv_auto('s3://mybuck/csv/csv_data.csv',all_varchar=1);	
    --URL  http://obs.cn-east-1.xx.com/mybuck/csv/csv_data.csv


 -- 2.在 S3 上创建 DuckLake 目录   创建 DuckLake 目录并连接 S3
 LOAD ducklake;
 ATTACH 'ducklake:metadata.ducklake' (
   DATA_PATH 's3://your-bucket/your-prefix/'  -- 替换为你的 S3 路径
 );	

 metadata.ducklake 是元数据文件名(DuckDB 会自动管理)。
 DATA_PATH 指定 S3 存储路径,所有 Parquet 数据将存储在此目录下
 
---3.. 创建表、插入数据、更新和删除 
 -- 在 DuckLake 目录中创建表
  CREATE TABLE IF NOT EXISTS metadata.customers (      );

 
 
--4 DuckLake 支持时间旅行以及 ACID 事务
 ##duckLake支持时间旅行,我们可以使用该ducklake_snapshots()功能查询可用的快照。
## 快照时间戳 版本号:只需使用TIMESTAMP而不是VERSION。  snapshot_id  snapshot_time  schema_version  changes
## 函数查看版本之间发生了什么变化ducklake_table_changes()
 show databases;
 FROM glob('s3://tmp-mehdio/ducklake/*.parquet');
 FROM ducklake_snapshots('metadata');
 FROM metadata.customers  AT (VERSION => 2);
 FROM ducklake_table_changes('metadata', 'main', 'customers', 2, 3);
 		 
##隐式事务
##显式事务  用BEGIN TRANSACTION /  dCOMMIT  / ROLLBACK/	
 轻松查询“截至昨天”的数据状态 表格格式

其他数据库

  -- 元数据操作(例如跟踪版本、处理删除、更新模式)规模虽小但频率很高——事务型数据库非常适合。
  -- 创建 create a PostgreSQL secret
    CREATE SECRET(
        TYPE postgres,
        HOST '',
        PORT 6543,
        DATABASE postgres,
        USER '',
        PASSWORD ''
    );
    LOAD postgres;
    LOAD ducklake;
	-- 使用FROM duckdb_extensions(); 检查 DuckDB 扩展列表及其状态(已安装、已加载)
	FROM duckdb_extensions();
	---  METADATA_SCHEMA parameter if you want to use a different schema than main
    ATTACH 'ducklake:postgres:dbname=postgres' AS mehdio_ducklake(DATA_PATH 's3://tmp-mehdio/ducklake/');
    use mehdio_ducklake;
  ---元数据非常小,通常不到实际数据的 1%。将其存储在数据库中可以避免在 Blob 存储上
   -- 元数据存储在数据库中,一条SQL 查询即可解析所有内容(包括当前快照、文件列表、架构等),然后您就可以查询数据

计算与存储解耦

    Data  parquet
	Metadata  DuckLake 将元数据存储在关系数据库中。
  文件的存储格式 : file formats like Parquet and Avro.
  文件的存储位置:  本地 以及S3 
      engineers started storing analytical data as files—mainly 
	       in open, columnar formats like Parquet—
	       on object storage (e.g., AWS S3, Google Cloud Storage, Azure Blob Storage).
  元数据存储的文件: 数据库文件 存储位置: duckdb 或者postgresql

 
 在Playground 上学习 Postgres 您可能熟悉在线教程“playgrounds”(
 DuckDB 客户端或DuckDB UI查询这些表。您可以通过
     SELECT database_name, table_name 
     FROM duckdb_tables 
     WHERE schema_name='public' and database_name LIKE '__ducklake_metadata_%';
 找到它们,数据库名称将遵循以下模式:_ducklake_metadata_<your_catalog_name>

使用postgresql

  1、Installing and Loading 安装和加载扩展
     INSTALL postgres;
     LOAD postgres;
  2.连接数据库
     --1.public schema of the PostgreSQL instance
	    ATTACH '' AS postgres_db (TYPE postgres);
   --或者  --2 connect to the PostgreSQL instance with the given parameters in read-only mode, run:
     ATTACH 'dbname=postgres user=postgres host=127.0.0.1' AS db (TYPE postgres, READ_ONLY);
	--或者通过密码 PostgreSQL connection information can also be specified with secrets		
    CREATE SECRET (
        TYPE postgres,
        HOST '127.0.0.1',
        PORT 5432,
        DATABASE postgres,
        USER 'postgres',
        PASSWORD ''
    );
	ATTACH 'dbname=my_other_db' AS postgres_db (TYPE postgres);
	--- The information from the secret will be used when ATTACH is called.
	-- Managing Multiple Secrets
     ATTACH '' AS postgres_db_one (TYPE postgres, SECRET postgres_secret_one);

表-格式 Table Format

表-格式  表格式负责逻辑层面的管理,而存储格式负责实际的存储和压缩方
    Both Iceberg and Delta
	    Apache  Iceberg 使用一系列JSON和Avro文件来定义模式、快照以及哪些Parquet文件在某个时间点属于表的一部分
	    Databricks Delta Lake  的底层存储格式是 Delta 表,最终是 Parquet
		Apache Hudi   列式 parquet 文件和基于行的 Avro 日志文件的组合来存储数据
原生格式和专有格式 以及开放表格式
    Native formats     proprietary formats 
	open data formats
开放表格式
   Open table formats provide an extension on the file formats, 
    providing support for table level operations
  		including ACID transactions, 
		        schema evolution and time travel (data version history)		 
   
	longer term history to be stored in an open format

duckdb

主体,时间戳和指标数据 时序数据库表示的是资产或者过程是如何随着时间变化的,体现的是“变化”的过程价值。		
	InfluxDB、Kdb、Prometheus这三个时序数据库
	
	
duckdb -c "SELECT * FROM my_table;" 这将在不启动交互式界面的情况下执行查询	
   -c     command
   -cmd   command
   -s     command
   -f FILENAME    -init FILENAME
 outmode   -ascii -box -column  -csv -html   -json  -line -list  -markdown   -quote  -table
 -echo
	
	./duckdb me.duckdb -init prompt.sql
	
	
 Command Line Data Processing: Using DuckDB as a Unix Tool
    duckdb -c "COPY (SELECT #1, #3 FROM 'pop.csv') TO '/dev/stdout/'"

duckdb 命令行和脚本

命令行
    cat some-file.json | duckdb -s "SELECT * FROM read_json_auto('/dev/stdin')";
	
	
脚本
 #!/bin/bash 
 function csv_to_parquet() {     
     file_path="$1"     
     duckdb -c "COPY (SELECT * FROM read_csv_auto('$file_path')) TO '${file_path%.*}.parquet' (FORMAT PARQUET);" }	
	 
	 
客户端
	  COPY (SELECT * FROM read_csv_auto('http://raw.gith/fivethirtyeight/data/master/bechdel/movies.csv'))
      TO 'movies.parquet' (FORMAT 'parquet');
	  
	  
管道 
 支持管道传递参数的命令,如find,这就需要 xargs(eXtended ARGuments)!!!	
    	-i/I,将xargs的每项名称,一般是一行一行赋值给 {},可以用 {} 代替
		
 python  subprocess			

参考

 数据库-SQL_DuckDB 访问 Minio-阿里oss-华为obs等对象存储
 使用 DuckLake 和 DuckDB 构建 S3 数据湖实战指南 https://blog.csdn.net/neweastsun/article/details/148454995
 https://motherduck.com/blog/getting-started-ducklake-table-format/
  Getting Started with DuckLake: A New Table Format for Your Lakehouse
 https://duckdb.org/docs/stable/core_extensions/postgres.html
 https://dataintellect.com/blog/open-data-formats-capital-markets/
 https://gist.github.com/mehd-io/9afab092e807a4097864b09e7e9835e9
 https://sqlite.org/cli.html
 https://duckdb.org/2024/06/20/cli-data-processing-using-duckdb-as-a-unix-tool.html
 https://duckdbsnippets.com/
posted @ 2025-06-11 18:02  辰令  阅读(456)  评论(0)    收藏  举报