一文讀懂Databend的開放表格式引擎

dsxvnm發表於2024-03-11

  Databend 近期釋出 Apache Iceberg 和 Delta Table 兩類表引擎,以提供對兩種目前最受歡迎的開放表格式的支援,滿足基於不同技術棧的現代資料湖方案面臨的高階分析需求。
  採用基於 Databend / Databend Cloud 的一站式解決方案,可以在不啟用額外的 Spark / Databricks 服務的前提下,完成對開放表格式資料的洞見,簡化部署架構與分析流程。此外,利用 Databend / Databend Cloud 在 Apache OpenDAL™ 之上構建的資料訪問方案,可以便捷訪問數十種儲存服務,包括物件儲存、HDFS 甚至 IPFS ,可以與現有技術棧輕鬆整合。
  優勢
  在使用開放表格式引擎時,只需要指定表引擎的型別(Delta 或 Iceberg)和資料檔案儲存的位置,即可直接訪問對應的表並利用 Databend 進行查詢。
  利用 Databend 的開放表格式引擎,可以輕鬆應對混合不同資料來源、不同表格式資料的場景:
  在同一個資料庫物件下,查詢和分析以不同格式彙總的資料表。
  憑藉 Databend 的豐富儲存後端整合,應對不同儲存後端中的資料訪問需求。
  不足
  目前 Apache Iceberg 和 Delta Lake 引擎僅支援只讀操作,也就是隻能查詢資料,無法向表中寫入資料。
  表的 Schema 是在表建立時確定的,如果對原始表的 Schema 進行了修改,為了保證資料的一致與同步,需要在 Databend 中重新建立表。
  使用方法
  -- Set up connection
  CREATE [ OR REPLACE ] CONNECTION [ IF NOT EXISTS ] <connection_name>
  STORAGE_TYPE = ''
  [ <storage_params> ]
  -- Create table with Open Table Format engine
  CREATE TABLE <table_name>
  ENGINE = [Delta | Iceberg]
  LOCATION = '<location_to_table>'
  CONNECTION_NAME = '<connection_name>'
  小貼士: Databend 中使用 CONNECTION 管理與外部儲存服務進行互動所需的詳細資訊,比如訪問憑證、端點 URL 和儲存型別。透過指定 CONNECTION_NAME ,可以在建立資源時複用 CONNECTION,簡化儲存配置的管理和使用。
  與 Catalog 方案的對比
  此前 Databend 已經透過 Catalog 提供 Iceberg 和 Hive 的支援,相比表引擎,Catalog 更加適合完整對接相關生態,一次性掛載多個資料庫和表的情況。
  而新增的開放表格式引擎在體驗上更加靈活,支援在同一個資料庫下彙總並混合來自不同資料來源、不同表格式的資料,並進行有效地分析與洞見。
  Workshop:使用 Databend Cloud 分析 Delta Table 中的資料
  在這個示例將會展示如何利用 Databend Cloud 載入並分析位於物件儲存中的 Delta Table 。
  我們將會使用經典的企鵝體態特徵資料集(penguins),將其轉化為 Delta Table 並放置在 S3 相容的物件儲存中。該資料集一共包含 8 個變數,其中 7 個特徵變數,1 個分類變數,共計 344 個樣本。
  分類變數為企鵝類別(species),屬於硬尾企鵝屬的三個亞屬,分別是 Adélie ,Chinstrap 和 Gentoo 。
  包含的三種企鵝的六個特徵,分別是所在島嶼(island),嘴巴長度(bill_length_mm),嘴巴深度(bill_depth_mm),腳蹼長度(flipper_length_mm),身體體重(body_mass_g),性別(sex)。
  如果你還沒有 Databend Cloud 帳號,歡迎訪問 https://app.databend.cn/register 註冊並獲取免費額度。或者也可以參考 https://docs.databend.com/guides/deploy/ 在本地部署 Databend 。
  本文中還涉及物件儲存的使用,也可以嘗試使用具有免費額度的 Cloudflare R2 建立 Bucket 。
  向物件儲存中寫入資料
  我們需要安裝對應的 Python 包,seaborn 負責提供原始資料,deltalake 負責將資料轉換為 Delta Table 並寫入 S3 :
  pip install deltalake seaborn
  然後,編輯下面的程式碼,配置對應的訪問憑據,並另存為 writedata.py :
  import seaborn as sns
  from deltalake.writer import write_deltalake
  ACCESS_KEY_ID = ''
  SECRET_ACCESS_KEY = ''
  ENDPOINT_URL = ''
  storage_options = {
  "AWS_ACCESS_KEY_ID": ACCESS_KEY_ID,
  "AWS_SECRET_ACCESS_KEY": SECRET_ACCESS_KEY,
  "AWS_ENDPOINT_URL": ENDPOINT_URL,
  "AWS_S3_ALLOW_UNSAFE_RENAME": 'true',
  }
  penguins = sns.load_dataset('penguins')
  write_deltalake("s3://penguins/", penguins, storage_options=storage_options)
  執行上面的 Python 指令碼,以向物件儲存中寫入資料:
  python writedata.py
  使用 Delta 表引擎訪問資料
  在 Databend 中建立對應的訪問憑據:
  --Set up connection
  CREATE CONNECTION my_r2_conn
  STORAGE_TYPE = 's3'
  SECRET_ACCESS_KEY = ''
  ACCESS_KEY_ID = ''
  ENDPOINT_URL = '';
  建立由 Delta 表引擎支援的資料表:
  -- Create table with Open Table Format engine
  CREATE TABLE penguins
  ENGINE = Delta
  LOCATION = 's3://penguins/'
  CONNECTION_NAME = 'my_r2_conn';
  利用 SQL 查詢和分析表中的資料
  驗證資料的可訪問性
  首先,讓我們輸出 5 個企鵝的種類和所在的島嶼,以檢查是否能夠正確訪問到 Delta Table 中的資料。
  SELECT species, island FROM penguins LIMIT 5;
  資料過濾
  接下來,可以進行一些基本的資料過濾操作,比如找出腳蹼長度超過 210mm 的雄性企鵝可能屬於哪一個亞屬。
  SELECT DISTINCT species
  FROM penguins
  WHERE sex = 'Male'
  AND flipper_length_mm > 210;
  資料分析
  類似地,我們可以嘗試計算每隻企鵝嘴巴長度和深度的比例,並輸出最大的五個資料。
  SELECT bill_length_mm / bill_depth_mm AS length_to_depth
  FROM penguins
  ORDER BY length_to_depth DESC
  LIMIT 5;
  混合資料來源案例:企鵝觀察日誌
  現在將會進入一個有趣的部分:假設我們發現了科考站的一份觀察記錄,讓我們嘗試在同一個資料庫下錄入這份資料,並且嘗試進行一項簡單的資料分析:某隻特定性別的企鵝被某位科學家標記的機率是多少。
  建立觀察日誌表
  使用預設的 FUSE 引擎建立 penguin_observations 表,包含 ID、日期、姓名、企鵝種類與性別、備註等幾類資訊。
  CREATE TABLE penguin_observations (
  observation_id INT,
  observation_date DATE,
  observer_name VARCHAR,
  penguin_species VARCHAR,
  penguin_sex VARCHAR,
  notes TEXT,
  );
  錄入觀察日誌
  讓我們嘗試手工錄入全部 10 條日誌。已知日誌記錄中出現的企鵝互不相同。
  INSERT INTO penguin_observations (observation_id, observation_date, observer_name, penguin_species, penguin_sex, notes)
  VALUES
  (1, '2023-01-01', 'Dr. Kowalski', 'Adelie', 'Male', 'Noticed aggressive behavior towards peers.'),
  (2, '2023-01-02', 'Dr. Smith', 'Chinstrap', 'Female', 'Sighted building a nest.'),
  (3, '2023-01-03', 'Dr. Kowalski', 'Gentoo', 'Female', 'Observed feeding offspring.'),
  (4, '2023-01-04', 'Dr. Smith', 'Adelie', 'Male', 'Found resting by the shoreline.'),
  (5, '2023-01-05', 'Dr. Kowalski', 'Adelie', 'Female', 'Engaged in mating rituals.'),
  (6, '2023-01-06', 'Dr. Kowalski', 'Gentoo', 'Male', 'Spotted swimming in the open water.'),
  (7, '2023-01-07', 'Dr. Smith', 'Chinstrap', 'Male', 'Appeared to be molting.'),
  (8, '2023-01-08', 'Dr. Smith', 'Gentoo', 'Female', 'Seen with a potential mate.'),
  (9, '2023-01-09', 'Dr. Kowalski', 'Adelie', 'Female', 'Observed preening feathers.'),
  (10, '2023-01-10', 'Dr. Kowalski', 'Adelie', 'Male', 'Identified with a tagged flipper.');
  計算標記機率
  現在讓我們計算在所有企鵝中,某隻雄性 Adelie 企鵝被 Dr. Kowalski 觀察的機率。首先我們需要統計 Dr. Kowalski 觀察到的雄性 Adelie 企鵝的個數,然後統計所有記錄在案的雄性 Adelie 企鵝個數,最後相除得到結果。
  SELECT
  (SELECT COUNT()
  FROM penguin_observations
  WHERE observer_name = 'Dr. Kowalski'
  AND species = 'Adelie'
  AND sex = 'Male')::FLOAT /
  (SELECT COUNT(
)
  FROM penguins
  WHERE species = 'Adelie'
  AND sex = 'Male')::FLOAT AS observation_probability;
  總結
  憑藉組合不同表引擎進行查詢,Databend / Databend Cloud 可以支撐在同一個資料庫下混合不同格式的表,並進行分析與查詢。本文只是提供一個基本的 Workshop 供大家體驗功能和使用,歡迎大家基於這個案例進行擴充,探索更多組合 Iceberg 和 Delta Table 進行資料分析的場景,以及更多潛在的真實世界應用。

相關文章