数据湖
数据湖是一种存储系统,底层包括不同的文件格式及湖表格式,可存储大量非结构化和半结构化的原始数据
数据仓库
数据仓库和流结合形成了 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);
表-格式 表格式负责逻辑层面的管理,而存储格式负责实际的存储和压缩方
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/