SQLMesh 系列教程:Airbnb數據分析項目實戰

在本文中,我們將探討如何利用dbt項目的代碼庫來實現一個簡單的SQLMesh項目。本文的基礎是基于Udemy講師為dbt課程創建的示例項目,可以在這個GitHub repo中獲得。這個dbt項目是相對完整的示例,我們將使用它作為模板來演示SQLMesh(下一代數據轉換工具)的功能。

dbt示例項目在Snowflake中使用Airbnb數據集分析端到端的數據工程工作流。該項目包括將原始數據加載到Snowflake中,創建各種模型,并執行轉換以從數據中獲得有意義的見解。我們打算使用duckdb作為分析數據庫,方便讀者直接在本機上測試運行。

簡要說明Airbnb數據集

本項目中使用的Airbnb數據集由三個主表組成:raw_listings、raw_reviews和raw_hosts。這些表格包含有關Airbnb房源的信息、對房源的評論以及房東的詳細信息。理解這些表之間的關系和意義對于處理和分析數據至關重要。

  1. raw_listings(原始房源信息):
    ? 描述:此表包含有關愛彼迎房源的詳細信息,包括房源 ID、網址、名稱、房型、最短入住天數、房東 ID、價格以及創建和更新的時間戳。
    ? 重要性:房源數據提供了愛彼迎上可用房源的全面視圖。它是與評論和房東數據相連接的核心表。

  2. 原始評論:
    ? 描述:此表包含愛彼迎房源的評論,包含房源 ID、評論日期、評論者姓名、評論內容和情感傾向等信息。
    ? 重要性:評論數據能提供有關客戶體驗和滿意度的見解。它通過房源 ID 與房源數據相關聯。

  3. raw_hosts:
    ? 描述:此表包含有關房源的信息,包括房源 ID、名稱、超級房源狀態以及創建和更新的時間戳。
    ? 重要性:房源數據提供了有關提供房源的個人或實體的詳細信息。它通過 host_id 與房源數據相關聯。

項目最終目標

本項目的首要目標是分析滿月日期對愛彼迎(Airbnb)評分和評論的影響。通過利用房源、評論和房東之間的關系,我們旨在得出有關月相周期對客戶反饋和滿意度影響的有意義的見解。

實現SQLMesh項目的步驟

  1. 初始化SQLMesh項目

? 創建一個名為airbnb_sqlmesh的文件夾,并進入該文件夾。執行如下命令初始化SQLMesh項目:

python -m venv .venv
source .venv/bin/activate
pip install "sqlmesh"
sqlmesh init duckdb
  1. 項目結構

    在初始化完成后,將會創建以下目錄和文件,從而為我們的 SQLMesh 項目提供組織結構:
    ? config.yaml:用于您項目的數據庫配置文件。
    ? models:存放 SQL 和 Python 模型的目錄。
    ? audits:存放共享審計的目錄。
    ? tests:存放單元測試的目錄。
    ? macros:存放宏的目錄。

? 刪除models、seeds以及tests目錄下的示例文件,后續我們會添加實際業務需要的模型。

  1. 項目配置

    在配置文件中定義SQLMesh項目配置。yaml文件。該文件包含數據庫連接細節和模型默認值:

gateways:duckdb:connection:type: duckdbdatabase: dw.dbdefault_gateway: duckdbmodel_defaults:dialect: duckdbstart: 2025-03-17
  1. 加載原始數據

    使用以下SQL腳本將原始數據加載到duckdb表中:

INSTALL httpfs;
LOAD httpfs;-- Create and load raw_listings table
CREATE OR REPLACE TABLE raw_listings (id integer,listing_url string,name string,room_type string,minimum_nights integer,host_id integer,price string,created_at datetime,updated_at datetime
);COPY raw_listings FROM 's3://dbtlearn/listings.csv' (ignore_errors true);-- Create and load raw_reviews table
CREATE OR REPLACE TABLE raw_reviews (listing_id integer,date datetime,reviewer_name string,comments string,sentiment string
);COPY raw_reviews FROM 's3://dbtlearn/reviews.csv' (ignore_errors true);-- Create and load raw_hosts table
CREATE OR REPLACE TABLE raw_hosts (id integer,name string,is_superhost string,created_at datetime,updated_at datetime
);COPY raw_hosts FROM 's3://dbtlearn/hosts.csv' (ignore_errors true);

創建模型

源(Source )模型

我們在 models/source 文件夾內的原始數據表基礎上創建了三個模型 src_hosts.sql、src_listings.sql 和 src_reviews.sql:
本項目中的源模型旨在對來自 Airbnb 數據集的原始數據進行標準化和準備,以便進一步處理和分析。它們充當中間層,通過重命名列、選擇相關字段以及標準化數據等方式將原始數據轉換為更易于使用的格式。所有源模型都被實現為視圖,確保數據干凈、結構化,并為后續在維度和事實模型中的轉換和分析做好準備。

src_listings.sql 模型:

MODEL (  name src.SRC_LISTINGS,kind view
);WITH mr_listings AS (SELECT * FROM main.RAW_LISTINGS
)
SELECTid AS listing_id,name AS listing_name,listing_url,room_type,minimum_nights,host_id,price AS price_str,created_at,updated_at
FROM mr_listings;

src_reviews.sql模型:

MODEL (name src.SRC_REVIEWS,kind view
);WITH mr_reviews AS (SELECT * FROM main.raw_reviews
)
SELECTlisting_id,date AS review_date,reviewer_name,comments AS review_text,sentiment AS review_sentiment
FROM mr_reviews;

src_hosts.sql模型:

MODEL (name src.SRC_HOSTS,kind view
);WITH mr_hosts AS (SELECT * FROM main.RAW_HOSTS
)
SELECTid AS host_id,name AS host_name,is_superhost,created_at,updated_at
FROM mr_hosts;

運行命令,生成源模型:

sqlmesh plan dev 

生成src__dev schema以及三個視圖:

D select table_catalog, table_schema,table_name, table_type from information_schema.tables where table_schema='src__dev';
┌───────────────┬──────────────┬──────────────┬────────────┐
│ table_catalog │ table_schema │  table_name  │ table_type │
│    varchar    │   varchar    │   varchar    │  varchar   │
├───────────────┼──────────────┼──────────────┼────────────┤
│ dw            │ src__dev     │ src_hosts    │ VIEW       │
│ dw            │ src__dev     │ src_listings │ VIEW       │
│ dw            │ src__dev     │ src_reviews  │ VIEW       │
└───────────────┴──────────────┴──────────────┴────────────┘

維度模型

在models/dim文件夾中創建維度模型作為視圖:

維度模型實現對源數據的清理、豐富和組合,以便進行詳細分析。它們處理空值、格式化字段和合并相關數據集。模型dim.dim_hosts_cleaned和dim. dim_listings_cleaned被具體化為視圖,而dim.dim_listings_w_hosts被具體化為一個完整的表,每次都完全重新加載。

dim.dim_hosts_cleaned模型:

MODEL (name dim.dim_hosts_cleansed,kind view
);WITH src_hosts AS (SELECT * FROM SOURCE.SRC_HOSTS
)
SELECThost_id,NVL(host_name, 'Anonymous') AS host_name,is_superhost,created_at,updated_at
FROM src_hosts;

dim. dim_listings_cleaned模型:

MODEL (name dim.dim_listings_cleansed,kind view
);WITH src_listings AS (SELECT * FROM SOURCE.SRC_LISTINGS
)
SELECTlisting_id,listing_name,room_type,CASE WHEN minimum_nights = 0 THEN 1 ELSE minimum_nights END AS minimum_nights,host_id,REPLACE(price_str, '$', '')::NUMERIC(10, 2) AS price,created_at,updated_at
FROM src_listings;

dim.dim_listings_w_hosts模型

MODEL (name dim.dim_listings_w_hosts,kind full
);WITH l AS (SELECT * FROM dim.dim_listings_cleansed
),
h AS (SELECT * FROM dim.dim_hosts_cleansed
)
SELECTl.listing_id,l.listing_name,l.room_type,l.minimum_nights,l.price,l.host_id,h.host_name,h.is_superhost AS host_is_superhost,l.created_at,GREATEST(l.updated_at, h.updated_at) AS updated_at
FROM l
LEFT JOIN h ON (h.host_id = l.host_id);

運行命令,生成維度表:

D select table_catalog, table_schema,table_name, table_type from information_schema.tables where table_schema='dim__dev';
┌───────────────┬──────────────┬───────────────────────┬────────────┐
│ table_catalog │ table_schema │      table_name       │ table_type │
│    varchar    │   varchar    │        varchar        │  varchar   │
├───────────────┼──────────────┼───────────────────────┼────────────┤
│ dw            │ dim__dev     │ dim_hosts_cleansed    │ VIEW       │
│ dw            │ dim__dev     │ dim_listings_cleansed │ VIEW       │
│ dw            │ dim__dev     │ dim_listings_w_hosts  │ VIEW       │
└───────────────┴──────────────┴───────────────────────┴────────────┘

事實模型

Fact 模型會在 models/fct 文件夾內創建增量型 Fact 模型:
Fact 模型 fct.reviews 會處理并匯總來自源模型的評論數據。這是一個增量型模型,意味著它只會加載新數據,這極大地減少了每次模型運行所需的計算資源。在模型中,@start 和 @end_date 是 SQLMesh 宏,在 sqlmesh 計劃或運行期間會根據運行的適當開始和結束日期進行渲染。此外,@GENERATE_SURROGATE_KEY 宏用于根據給定的輸入列生成 MD5 哈希值,為數據生成一個替代鍵。

MODEL (name fct.reviews,kind INCREMENTAL_BY_TIME_RANGE (time_column review_date)
);WITH src_reviews AS (SELECT * FROM SOURCE.SRC_REVIEWS
)
SELECT@GENERATE_SURROGATE_KEY(listing_id, review_date, reviewer_name, review_text) AS review_id,*
FROM src_reviews
WHERE review_text IS NOT NULLAND review_date BETWEEN @start_date AND @end_date;

運行命令,生成事實表:

D select table_catalog, table_schema,table_name, table_type from information_schema.tables where table_schema='fct__dev';
┌───────────────┬──────────────┬────────────┬────────────┐
│ table_catalog │ table_schema │ table_name │ table_type │
│    varcharvarcharvarcharvarchar   │
├───────────────┼──────────────┼────────────┼────────────┤
│ dw            │ fct__dev     │ reviews    │ VIEW       │
└───────────────┴──────────────┴────────────┴────────────┘

業務層模型

轉到業務層,我們需要分析滿月日期如何影響評審意見。為此,我們需要一個包含滿月日期的表。這可以使用SQLMesh中的種子文件來實現。從提供的鏈接下載種子文件,并將其放在SQLMesh項目的種子文件夾中。然后,創建一個名為full_moon_dates_seed.sql 的種子模型。

MODEL (name seed.full_moon_dates,kind SEED (path '../seeds/seed_full_moon_dates.csv')
);

運行命令,生成seed日期模型:

D select table_catalog, table_schema,table_name, table_type from information_schema.tables where table_schema='seed__dev';
┌───────────────┬──────────────┬─────────────────┬────────────┐
│ table_catalog │ table_schema │   table_name    │ table_type │
│    varcharvarcharvarcharvarchar   │
├───────────────┼──────────────┼─────────────────┼────────────┤
│ dw            │ seed__dev    │ full_moon_dates │ VIEW       │
└───────────────┴──────────────┴─────────────────┴────────────┘

對于最終的模型,創建名為models/mart的文件夾,并在其中添加以下模型:

MODEL (name mart.mart_fullmoon_reviews,kind full
);WITH fct_reviews AS (SELECT * FROM fct.reviews
),
full_moon_dates AS (SELECT * FROM seed.full_moon_dates
)SELECTr.*,CASEWHEN fm.full_moon_date IS NULL THEN 'not full moon'ELSE 'full moon'END AS is_full_moon
FROMfct_reviews as rLEFT JOIN full_moon_dates as fmON ( r.review_date = DATE_ADD(strptime(fm.full_moon_date, '%Y-%m-%d'), INTERVAL 1 DAY) )

運行命令,生成模型:

D select table_catalog, table_schema,table_name, table_type from information_schema.tables where table_schema='mart__dev';
┌───────────────┬──────────────┬───────────────────────┬────────────┐
│ table_catalog │ table_schema │      table_name       │ table_type │
│    varcharvarcharvarcharvarchar   │
├───────────────┼──────────────┼───────────────────────┼────────────┤
│ dw            │ mart__dev    │ mart_fullmoon_reviews │ VIEW       │
└───────────────┴──────────────┴───────────────────────┴────────────┘

一旦所有的模型都創建好了,項目結構應該是這樣的:

在這里插入圖片描述

在開發模式下測試成功后,我們在生產模式下運行sqlmesh計劃:

sqlmesh plan prod

輸出結果:

 sqlmesh plan prod`prod` environment will be initializedModels:
└── Added:├── dim.dim_hosts_cleansed├── dim.dim_listings_cleansed├── dim.dim_listings_w_hosts├── fct.reviews├── mart.mart_fullmoon_reviews├── seed.full_moon_dates├── src.src_hosts├── src.src_listings└── src.src_reviews
Apply - Virtual Update [y/n]: 

選擇y,sqlmesh會自動創建生產環境所需的模型,SQLMesh不會像在開發環境中那樣重新處理所有數據。相反,它重用在開發環境中創建的模型。有關SQLMesh虛擬環境的更多信息,請參閱此鏈接。

最后通過命令sqlmesh ui 啟動web開發頁面,圖示如下:
在這里插入圖片描述

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

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

相關文章

單片機寫的小液晶屏驅動+漢字滾屏

單片機寫的小液晶屏驅動漢字滾屏 stm32f401freertos內置HZK16 單片機漢字滾屏

【Golang那些事】go1.22和1.23 更新重點及測評

好久沒有寫文章了,攢了一年的Golang版本特性的技術點以及踩過的坑,那就在新年第一篇的文章中做一個總結吧: 一、關于迭代器 (一)迭代器去掉了共享共享內存 一個經典的面試題 說到Golang經典的面試題,大家可能都刷到過很多&…

python力扣438.找到字符串中所有字母異位詞

給定兩個字符串 s 和 p,找到 s 中所有 p 的 異位詞的子串,返回這些子串的起始索引。不考慮答案輸出的順序。 示例 1: 輸入: s “cbaebabacd”, p “abc” 輸出: [0,6] 解釋: 起始索引等于 0 的子串是 “cba”, 它是"abc" 的異位詞。 起始索引…

【大模型實戰篇】使用GPTQ量化QwQ-32B微調后的推理模型

1. 量化背景 之所以做量化,就是希望在現有的硬件條件下,提升性能。量化能將模型權重從高精度(如FP32)轉換為低精度(如INT8/FP16),內存占用可減少50%~75%。低精度運算(如INT8&#xf…

【MySQL】架構

MySQL架構 和其它數據庫相比,MySQL有點與眾不同,它的架構可以在多種不同場景中應用并發揮良好作用。主要體現在存儲引擎的架構上,插件式的存儲引擎架構將查詢處理和其它的系統任務以及數據的存儲提取相分離。這種架構可以根據業務的需求和實…

JavaScript 金額運算精度丟失問題及解決方案

JavaScript 金額運算精度丟失問題及解決方案 1. 前言2. 為什么 JavaScript 計算金額會精度丟失?2.1 JavaScript 使用 IEEE 754 雙精度浮點數2.2 浮點運算錯誤示例**錯誤示例 1:0.1 0.2 ≠ 0.3****錯誤示例 2:浮點乘法精度問題** 3. 解決方案…

Docker安裝,并pullMySQL和redis

卸載原Docker 您的 Linux 發行版可能提供非官方的 Docker 軟件包,這可能與 Docker 提供的官方軟件包沖突。在安裝 Docker Engine 正式版之前,您必須先卸載這些軟件包。 sudo dnf remove docker \ docker-client \ docker-client-latest \ docker-common…

國內首臺太空采礦機器人亮相,宇宙資源開發邁入新階段

隨著地球資源的日益枯竭,人類將目光投向了浩瀚的宇宙。太空采礦作為一項前沿科技,正逐步從科幻走向現實。近日,中國礦業大學成功研制出國內首臺太空采礦機器人,標志著我國在太空資源開發領域邁出了重要一步。 太空采礦并非新鮮概念…

簡介PyCDE:Python CIRCT Design Entry

簡介PyCDE:Python CIRCT Design Entry 引言 在硬件設計和驗證領域,隨著設計復雜性的增加,傳統的方法往往難以滿足現代設計的需求。PyCDE(Python CIRCT Design Entry)作為CIRCT項目的一部分,旨在為硬件設計…

市場熱點復盤20240319

以下是對當前市場熱點板塊的分析總結,按邏輯分類如下: 一、機器人產業鏈核心標的 1. 減速器與核心部件 襄陽軸承:直接受益人形機器人減速器軸承需求,技術國內領先。金帝股份:聚焦機器人手指關節諧波減速機保持架&am…

目標檢測——清洗數據

清洗VOC格式數據集代碼示例 import os import xml.etree.ElementTree as ETdef process_annotations(image_folder, annotation_folder):# 遍歷標簽文件夾中的所有XML文件for xml_file in os.listdir(annotation_folder):if not xml_file.endswith(.xml):continuexml_path os…

Kubeasz工具快速部署K8Sv1.27版本集群(二進制方式)

文章目錄 一、基本信息二、服務器初始化操作三、使用Kubeasz部署K8S集群四、驗證集群 一、基本信息 1、部署需要滿足前提條件: 注意1:確保各節點時區設置一致、時間同步;注意2:確保在干凈的系統上開始安裝;注意3&…

RG-S3760應用協議配置

RG-S3760應用協議配置 1. dhcp 服務配置 提問:如何在設備上開啟dhcp 服務,讓不同VLAN 下的電腦獲得相應的IP 地址? 回答: 步驟一:配置VLAN 網關IP 地址,及將相關端口劃入相應的VLAN 中 S3760#con t S…

Java 文件和IO流基礎(生動形象版)

系列文章目錄 Java文件和IO流基礎部分 文件VSIO流 文章目錄 系列文章目錄前言一、文件的定義和理解: 1.專業定義: 2.文件系統和路徑: 二、IO流的定義和分類 1.定義:2.流的分類:修飾器模式的核心作用:基礎結…

Linux驅動學習筆記(四)

高級字符設備進階 1.一個完整的IO過程包含以下幾個步驟:1應用程序向操作系統發起IO調用請求(系統調用);2操作系統準備數據,把IO設備的數據加載到內核緩沖區;3操作系統拷貝數據,把內核緩沖區的數據從內核空間拷貝到應用…

el-table的行向上移動向下移動,刪除選定行

<template><el-table :data"tableData" border style"width: 100%"><!-- 其他列 --><el-table-column label"ID"><template slot-scope"scope">{{ scope.$index }}</template></el-table-colu…

人工智能之數學基礎:矩陣的降維

本文重點 在現實世界中,我們經常會遇到高維數據。例如,圖像數據通常具有很高的維度,每個像素點都可以看作是一個維度。高維數據不僅會帶來計算和存儲上的困難,還可能會導致 “維數災難”,即隨著維度的增加,數據的稀疏性和噪聲也會增加,從而影響數據分析的效果。因此,我…

2025年,電腦還需要分區嗎?

隨著2025年的到來&#xff0c;電腦存儲空間已經不像以前那么金貴&#xff0c;固態硬盤&#xff08;SSD&#xff09;容量更大、速度更快&#xff0c;云存儲也成了日常標配。許多人開始質疑&#xff1a;電腦還需要像以前那樣分區嗎&#xff1f; 一、分區到底是什么意思&#xff…

Springboot項目集成maven-assembly-plugin進行打包

通常我們將應用部署到服務器的某個目錄下&#xff0c;一般情況下我們會提供像target&#xff08;存放應用jar包&#xff09;&#xff0c;bin&#xff08;項目啟動/停止腳本&#xff09;&#xff0c;config&#xff08;項目配置文件&#xff09;&#xff0c;logs&#xff08;項目…

CSS3 基礎布局技術與響應式設計

1. CSS3 基礎與布局技術 1.1 Flexbox 布局 Flexbox 是一種一維布局模型&#xff0c;適合用于在一個方向上&#xff08;行或列&#xff09;排列元素。 基本概念&#xff1a; 容器&#xff08;Container&#xff09;&#xff1a;應用 display: flex; 的元素。項目&#xff08…