當 PyIceberg 和 DuckDB 遇見 AWS S3 Tables:打造 Serverless 數據湖“開源夢幻組合”

引言

在一些大數據分析場景比如電商大數據營銷中,我們需要快速分析存儲海量用戶行為數據(如瀏覽、加購、下單),以進行用戶行為分析,優化營銷策略。傳統方法依賴 Spark/Presto 集群或 Redshift 查詢 S3 上的 Parquet/ORC 文件,這對于需要快速迭代、按需執行的分析來說,成本高、運維復雜且響應不夠敏捷。

本文將介紹一種現代化的 Serverless 解決方案:利用 S3 Tables(內置優化的 Apache Iceberg 支持)作為存儲基礎,并結合 PyIceberg 的便捷性與 DuckDB 的高性能嵌入式分析能力,直接在 AWS Lambda 等環境中實現對 S3 數據的低成本、高效率即時查詢,徹底擺脫集群運維的負擔,加速您的用戶行為分析。關鍵工具及技術點:

  1. S3 Tables:在 S3 上為表格數據(采用內建優化的 Apache Iceberg 格式)設計的、具備自動性能優化的智能對象存儲。
  2. Lambda:提供按需運行代碼的無服務器計算能力
  3. PyIceberg:Iceberg 官方開源項目,提供簡潔的 Python API 來操作 Iceberg 表
  4. DuckDB:高性能嵌入式分析引擎,支持 Iceberg rest catalog 接口

核心實踐

使用 PyIceberg 創建和插入 S3 Tables

首先,安裝 python 依賴

pip install pyiceberg[s3fs, pyarrow]

創建表和插入表的核心代碼如下,通過 pyiceberg 對接 S3 Tables 的 rest catalog api 來實現 catalog 的獲取,從而實現表的創建、列出,以及數據的插入等操作。

from pyiceberg.catalog import load_catalog
import pyarrow as pa
rest_catalog = load_catalog("catalog_name",**{"type": "rest","warehouse": "arn:aws:s3tables:us-west-2:${awsAccountId}:bucket/testtable","uri": "https://s3tables.us-west-2.amazonaws.com/iceberg","rest.sigv4-enabled": "true","rest.signing-name": "s3tables","rest.signing-region": "us-west-2","py-io-impl": "pyiceberg.io.fsspec.FsspecFileIO"}
)
# 新建namespace
rest_catalog.create_namespace("namespace_example")
# 新建表
rest_catalog.create_table("namespace_example.test_table",schema=pa.schema([("id", pa.int32()),("data", pa.string()),])
)
# 打印表列表
tables_list = rest_catalog.list_tables("namespace_example")
print(tables_list)
# 獲取表對象
table = rest_catalog.load_table("namespace_example.test_table")
df = pa.Table.from_pylist([{"id": 303, "data": 'test insert icb'}], schema=table.schema().as_arrow()
)
#插入表
table.append(df)
# 讀取表并打印
for row in table.scan().to_arrow().to_pylist():
print(row)

可以先通過本地配置 AWS CLI 權限然后運行代碼進行測試,然后通過 docker 的方式部署 Lambda。

參考 Dockerfile:

FROM public.ecr.aws/lambda/python:3.12
COPY requirements.txt ${LAMBDA_TASK_ROOT}
RUN pip install -r requirements.txt
COPY lambda_function.py ${LAMBDA_TASK_ROOT}
CMD [ "lambda_function.handler" ]

使用 DuckDB 在 S3 Tables 進行復雜數據分析查詢

這里使用 1.2.1 版本的 DuckDB,通過 pip install duckdb==1.2.1 來安裝,DuckDB 最新的夜間版本插件支持了 Apache Iceberg REST 目錄,而 S3 Tables 也有 REST 目錄接口。可以通過在 Lambda 上部署 DuckDB 來讀取查詢分析 S3 Tables 里面的數據。也可以把 DuckDB 嵌入到您的應用程序中直接查詢 S3 Tables。

DuckDB 的 Lambda 實現代碼如下,結合了 boto3 的 S3 Tables 客戶端,通過 api 把 S3 Tables 里面的桶加載到 DuckDB 的 catalog 中,后續就可以直接通過 sql 來進行查詢了。Lambda 的入口函數接收 sql,然后返回 sql 的執行結果,示例 sql: Select * from bucketname.namespace.tablename 就可以直接查詢出對應桶里面的表的數據了,需要注意的是在 DuckDB 里面一般通過 DETACH 和 ATTACH 來獲取最新的 catalog 表元數據。

import os
import duckdb
import boto3
os.environ['HOME'] = '/tmp'
con = duckdb.connect(database=':memory:', config={'memory_limit': '9GB','worker_threads': 5,'temp_directory':'/tmp/file/overmem'})
# 驗證設置
con.execute("""
FORCE INSTALL aws FROM core_nightly;
FORCE INSTALL httpfs FROM core_nightly;
FORCE INSTALL iceberg FROM core_nightly;
CREATE SECRET (TYPE s3,PROVIDER credential_chain
);
""")
s3tables = boto3.client('s3tables')
table_buckets = s3tables.list_table_buckets(maxBuckets=1000)['tableBuckets']
def handler(event, context):for table_bucket in table_buckets:name = table_bucket['name']arn = table_bucket['arn']try:con.execute(f"DETACH {name};")except:passcon.execute(f"""ATTACH '{arn}' AS {name} (TYPE iceberg,ENDPOINT_TYPE s3_tables);""")sql = event.get("sql")try:result = con.execute(sql).fetchall()return {"statusCode": 200,"result": result}except Exception as e:return {"statusCode": 500,"error": str(e)}

Dockerfile 可以參考插入部分的 Dockerfile,通過鏡像部署到 Lambda,并設置好對應的 IAM 角色權限以及 Lambda 的超時以及內存設置。這里代碼通過 duckdb.connect(database=’:memory:’, config={‘memory_limit’: ‘9GB’,’worker_threads’: 5,’temp_directory’:’/tmp/file/overmem’})來設置最大內存的使用和工作的線程數,這個可以根據實際的需要來調整

數據分析實踐

測試數據集:電商用戶行為數據,總量 13 億數據,字段如下:

user_id??? ???????????STRING?? ? ??‘用戶ID(非真實ID),經抽樣&字段脫敏處理后得到’

item_id??? ???????????STRING? ?? ??‘商品ID(非真實ID),經抽樣&字段脫敏處理后得到’

item_category??? STRING?? ? ??‘商品類別ID(非真實ID),經抽樣&字段脫敏處理后得到’

behavior_type??? STRING??? ???‘用戶對商品的行為類型,包括瀏覽、收藏、加購物車、購買,pv,fav,cart,buy)’

behavior_time??? STRING?? ? ??‘行為時間,精確到小時級別’

測試 sql:用戶行為數據漏斗分析

WITH user_behavior_counts AS (SELECTuser_id,SUM(CASE WHEN behavior_type = 'pv' THEN 1 ELSE 0 END) AS view_count,SUM(CASE WHEN behavior_type = 'fav' THEN 1 ELSE 0 END) AS favorite_count,SUM(CASE WHEN behavior_type = 'cart' THEN 1 ELSE 0 END) AS cart_count,SUM(CASE WHEN behavior_type = 'buy' THEN 1 ELSE 0 END) AS purchase_countFROM testtable.testdb.commerce_shoppingGROUP BY user_id
),
funnel_stages AS (SELECTCOUNT(DISTINCT user_id) AS total_users,COUNT(DISTINCT CASE WHEN view_count > 0 THEN user_id END) AS users_with_views,COUNT(DISTINCT CASE WHEN favorite_count > 0 THEN user_id END) AS users_with_favorites,COUNT(DISTINCT CASE WHEN cart_count > 0 THEN user_id END) AS users_with_cart_adds,COUNT(DISTINCT CASE WHEN purchase_count > 0 THEN user_id END) AS users_with_purchasesFROM user_behavior_counts
)
SELECTtotal_users,users_with_views,users_with_favorites,users_with_cart_adds,users_with_purchases,ROUND(100.0 * users_with_views / total_users, 2) AS view_rate,ROUND(100.0 * users_with_favorites / users_with_views, 2) AS view_to_favorite_rate,ROUND(100.0 * users_with_cart_adds / users_with_favorites, 2) AS favorite_to_cart_rate,ROUND(100.0 * users_with_purchases / users_with_cart_adds, 2) AS cart_to_purchase_rate,ROUND(100.0 * users_with_purchases / total_users, 2) AS overall_conversion_rate
FROM funnel_stages;

Lambda 測試結果:消耗內存 1934M

用時:37s

關鍵優勢

將 PyIceberg 和 DuckDB 運行在 AWS Lambda 上來訪問 S3 上的 Iceberg 表,這種 Serverless 數據湖模式主要的優勢如下:

  • 低門檻:主要依賴 python 和 sql,這兩種是數據開發領域最常見的技能,大大降低了學習和使用的門檻,同時基礎設施 0 依賴且易于部署,不需要投入基礎設施運維。
  • 高性價比:Lambda 按實際計算時間付費且自動伸縮,而 S3 的存儲成本也較為低廉。加上 DuckDB 高性能的特性,這意味著更短的 Lambda 執行時間,進一步降低成本。
  • 開源與靈活性:核心組件 Apache Iceberg、DuckDB 和 PyIceberg 均為廣泛應用的開源項目。受益于活躍的開源社區支持,可以獲得持續的功能更新、問題修復和豐富的學習資源。

典型應用場景

  • 低成本海量分析負載對于需要控制成本,但仍需進行有效數據分析的場景,如中小型企業或特定項目預算有限的情況。
  • 非頻繁或突發性查詢如定期的報表生成、臨時的業務數據洞察、偶爾進行的數據探索等,這些場景下按需付費的 Lambda + DuckDB 極具優勢。
  • 事件驅動的數據處理由 S3 事件觸發 Lambda (PyIceberg) 進行數據驗證、轉換和加載到 Iceberg 表,后續可由另一個 Lambda (DuckDB) 進行即時查詢或聚合。
  • 交互式查詢接口后端通過 API Gateway 暴露一個 Lambda (DuckDB) 端點,為內部用戶或應用提供一個低成本的 SQL 查詢接口,用于查詢特定范圍的數據。
  • 快速原型驗證在開發或研究階段,快速搭建一個功能完備的數據湖查詢環境,用于驗證想法或進行小規模實驗。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/81833.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/81833.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/81833.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

流復備機斷檔處理

文章目錄 環境癥狀問題原因解決方案 環境 系統平臺:UOS(海光),UOS (飛騰),UOS(鯤鵬),UOS(龍芯),UOS (申威),銀河麒麟svs(X86_64&…

【藍橋杯真題精講】第 16 屆 Python A 組(省賽)

文章目錄 T1 偏藍 (5/5)T2 IPv6 (0/5)T3 2025 圖形 (10/10)T4 最大數字 (10/10)T5 倒水 (15/15)T6 拼好數 (0/15)T7 登山 (20/20)T8 原料采購 (20/20) 更好的閱讀體驗 高速訪問:https://wiki.dwj601.cn/ds-and-algo/lan-qiao-cup/16th-python-a/永久鏈接&#xff1…

SpringBoot+Dubbo+Zookeeper實現分布式系統步驟

SpringBootDubboZookeeper實現分布式系統 一、分布式系統通俗解釋二、環境準備(詳細版)1. 軟件版本2. 安裝Zookeeper(單機模式) 三、完整項目結構(帶詳細注釋)四、手把手代碼實現步驟1:創建父工…

Spring的業務層,持久層,控制層的關系

在 Spring 框架中,控制層(Controller)、業務層(Service) 和 持久層(Repository/Mapper) 是分層架構的核心組成部分,職責分離明確,通過依賴注入(DI&#xff09…

css實現不確定內容的高度過渡

實現效果&#xff1a;鼠標懸浮按鈕&#xff0c;高度過渡出現如圖所示文本框 代碼&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-widt…

計算機視覺與深度學習 | matlab實現ARIMA-WOA-CNN-LSTM時間序列預測(完整源碼和數據)

以下是一個基于MATLAB的ARIMA-WOA-CNN-LSTM時間序列預測框架。由于完整代碼較長,此處提供核心模塊和實現思路,完整源碼和數據可通過文末方式獲取。 1. 數據準備(示例數據) 使用MATLAB內置的航空乘客數據集: % 加載數據 data = readtable(airline-passengers.csv); data …

在 Excel 中使用東方仙盟軟件————仙盟創夢IDE

安裝插件 用仙盟創夢編寫插件代碼 源碼 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using ExcelDna.Integration;namespace 東方仙盟.仙盟創夢IDE_招標系統 {public static class 仙盟創夢_招標專…

Sql刷題日志(day9)

一、筆試 1、limit offset&#xff1a;分頁查詢 SELECT column1, column2, ... FROM table_name LIMIT number_of_rows OFFSET start_row; --跳過前 start_row 行&#xff0c;返回接下來的 number_of_rows 行。 2、lag、lead&#xff1a;查詢前后行數據 --lag函數用于訪問當…

C++面試3——const關鍵字的核心概念、典型場景和易錯陷阱

const關鍵字的核心概念、典型場景和易錯陷阱 一、const本質&#xff1a;類型系統的守護者 1. 與#define的本質差異 維度#defineconst編譯階段預處理替換編譯器類型檢查作用域無作用域&#xff08;全局污染&#xff09;遵循塊作用域調試可見性符號消失保留符號信息類型安全無類…

16-看門狗和RTC

一、獨立看門狗 1、獨立看門狗概述 在由單片機構成的微型計算機系統中&#xff0c;由于單片機的工作常常會受到來自外界電磁場的干擾&#xff0c;造成程序的跑飛&#xff08;不按照正常程序進行運行&#xff0c;如程序重啟&#xff0c;但是如果我們填加看門狗的技術&#xff0…

w~自動駕駛~合集3

我自己的原文哦~ https://blog.51cto.com/whaosoft/13269720 #FastOcc 推理更快、部署友好Occ算法來啦&#xff01; 在自動駕駛系統當中&#xff0c;感知任務是整個自駕系統中至關重要的組成部分。感知任務的主要目標是使自動駕駛車輛能夠理解和感知周圍的環境元素&…

怎么打包發布到npm?——從零到一的詳細指南

怎么打包發布到npm&#xff1f;——從零到一的詳細指南 目錄 怎么打包發布到npm&#xff1f;——從零到一的詳細指南一、準備工作1. 注冊 npm 賬號2. 安裝 Node.js 和 npm 二、初始化項目三、編寫你的代碼四、配置 package.json五、打包你的項目六、登錄 npm七、發布到 npm八、…

【C++ - 仿mudou庫one thread one loop式高并發服務器實現】

文章目錄 項目介紹項目模塊和服務器主要設計模式項目主要流程前置知識1.bind函數2.定時器任務TimerTask和時間輪思想TimerWheel3.正則表達式4.通用型容器Any類 服務器設計模式1&#xff09;單Reactor單線程模式2&#xff09;單Reactor多線程模式3&#xff09;多Reactor多線程模…

RISC-V 開發板 MUSE Pi Pro USB 測試(3.0 U盤,2.0 UVC攝像頭)

視頻講解&#xff1a; RISC-V 開發板 MUSE Pi Pro USB 測試&#xff08;3.0 U盤&#xff0c;2.0 UVC攝像頭&#xff09; 總共開發板有4個USB的A口&#xff0c;1個USB的TypeC口&#xff0c;我們插上兩個USB3.0的U盤和一個USB2.0的UVC攝像頭來進行測試 lsusb -tv 可以看到有3個US…

docker學習與使用(概念、鏡像、容器、數據卷、dockerfile等)

文章目錄 前言引入docker 簡介docker的應用場景docker的虛擬化技術VS虛擬機docker的優點docker架構Docker倉庫Docker鏡像linux操作系統的大致組成部分 Docker容器 docker安裝與啟動校驗版本移除舊的版本安裝依賴工具設置軟件源安裝docker驗證 配置鏡像加速器docker服務相關命令…

記錄一次服務器卡頓

一、服務器卡頓現象 服務用了一段時間后&#xff0c;突然很卡&#xff0c;發現在服務器上新建excel也很卡&#xff0c;發現服務器中病毒了&#xff0c;然后重新安裝了操作系統。重新安裝服務環境時&#xff0c;發現同時安裝pdf、tomcat時都很慢&#xff0c;只能一個安裝好了&am…

基于 Reactor 的 Java 高性能異步編程:響應式流與背壓詳解

本文將圍繞 Reactor 框架&#xff0c;深入剖析響應式流的核心機制&#xff0c;重點講解背壓&#xff08;Backpressure&#xff09;的實現原理與實際應用。通過理論結合實踐&#xff0c;希望幫助你真正掌握 Java 世界的響應式異步編程。 一、響應式編程與 Reactor 簡介 1.1 什么…

知識蒸餾實戰:用PyTorch和預訓練模型提升小模型性能

在深度學習的浪潮中&#xff0c;我們常常追求更大、更深、更復雜的模型以達到最先進的性能。然而&#xff0c;這些“龐然大物”般的模型往往伴隨著高昂的計算成本和緩慢的推理速度&#xff0c;使得它們難以部署在資源受限的環境中&#xff0c;如移動設備或邊緣計算平臺。知識蒸…

python:mysql全局大覽(保姆級教程)

本文目錄&#xff1a; 一、關于數據庫**二、sql語言分類**三、數據庫增刪改查操作**四、庫中表增刪改查操作**五、表中記錄插入**六、表約束**七、單表查詢**八、多表查詢**&#xff08;一&#xff09;外鍵約束**&#xff08;二&#xff09;連結查詢**1.交叉連接&#xff08;笛…

Android framework 問題記錄

一、休眠喚醒&#xff0c;很快熄屏 1.1 問題描述 機器休眠喚醒后&#xff0c;沒有按照約定的熄屏timeout 進行熄屏&#xff0c;很快就熄屏&#xff08;約2s~3s左右&#xff09; 1.2 原因分析&#xff1a; 抓取相關log&#xff0c;打印休眠背光 相關調用棧 //具體打印調用棧…