ClickHouse(11)ClickHouse合併樹MergeTree家族表引擎之SummingMergeTree詳細解析

来源:https://www.cnblogs.com/the-pig-of-zf/archive/2023/01/16/17056317.html
-Advertisement-
Play Games

SummingMergeTree引擎繼承自MergeTree。區別在於,當合併SummingMergeTree表的數據片段時,ClickHouse會把所有具有相同主鍵的行合併為一行,該行包含了被合併的行中具有數值數據類型的列的彙總值。如果主鍵的組合方式使得單個鍵值對應於大量的行,則可以顯著的減少存儲 ...


目錄

SummingMergeTree引擎繼承自MergeTree。區別在於,當合併SummingMergeTree表的數據片段時,ClickHouse會把所有具有相同主鍵的行合併為一行,該行包含了被合併的行中具有數值數據類型的列的彙總值。如果主鍵的組合方式使得單個鍵值對應於大量的行,則可以顯著的減少存儲空間並加快數據查詢的速度。

一般SummingMergeTree和MergeTree一起使用。例如,在準備做報告的時候,將完整的數據存儲在MergeTree表中,並且使用SummingMergeTree來存儲聚合數據。這種方法可以避免因為使用不正確的主鍵組合方式而丟失有價值的數據。

建表語法

CREATE TABLE [IF NOT EXISTS] [db.]table_name [ON CLUSTER cluster]
(
    name1 [type1] [DEFAULT|MATERIALIZED|ALIAS expr1],
    name2 [type2] [DEFAULT|MATERIALIZED|ALIAS expr2],
    ...
) ENGINE = SummingMergeTree([columns])
[PARTITION BY expr]
[ORDER BY expr]
[SAMPLE BY expr]
[SETTINGS name=value, ...]

創建SummingMergeTree表的參數中,與MergeTree不同的是[columns]。columns包含了將要被彙總的列的列名的元組。屬於可選參數。所選的列必須是數值類型,並且不可位於主鍵中。

如果沒有指定columns,ClickHouse會把所有不在主鍵中的數值類型的列都進行彙總。

其他的參數與MergeTree表是一致。

MergeTree表引擎的解析可以參考ClickHouse(09)ClickHouse合併樹MergeTree家族表引擎之MergeTree詳細解析

-- 建表
CREATE TABLE summtt
(
    key UInt32,
    value UInt32
)
ENGINE = SummingMergeTree()
ORDER BY key;

-- 插入數據
INSERT INTO summtt Values(1,1),(1,2),(2,1);

-- 查詢數據
-- ClickHouse可能不會完整的彙總所有行,因此在查詢中使用了聚合函數sum和GROUP BY子句。
-- ClickHouse定期合併插入的數據片段,併在這個時候對所有具有相同主鍵的行中的列進行彙總,將這些行替換為包含彙總數據的一行記錄。
SELECT key, sum(value) FROM summtt GROUP BY key;

-- 查詢結果
┌─key─┬─sum(value)─┐
│   2 │          1 │
│   1 │          3 │
└─────┴────────────┘

數據處理

當數據被插入到表中時,他們將被原樣保存。ClickHouse定期合併插入的數據片段,併在這個時候對所有具有相同主鍵的行中的列進行彙總,將這些行替換為包含彙總數據的一行記錄。

ClickHouse會按片段合併數據,以至於不同的數據片段中會包含具有相同主鍵的行,即單個彙總片段將會是不完整的。因此,聚合函數sum()和GROUP BY子句應該在(SELECT)查詢語句中被使用,如上面的例子。

彙總的通用規則

  • 列中數值類型的值會被彙總,進行sum操作。這些列的集合在參數columns中被定義。
  • 如果用於彙總的所有列中的值均為0,則該行會被刪除。
  • 如果列不在主鍵中且無法被彙總,則會在現有的值中任選一個。
  • 主鍵所在的列中的值不會被彙總。

AggregateFunction 列中的彙總

對於AggregateFunction類型的列,ClickHouse根據對應函數表現為AggregatingMergeTree引擎的聚合。

嵌套結構數據的處理

表中可以具有以特殊方式處理的嵌套數據結構。

如果嵌套表的名稱以 Map 結尾,並且包含至少兩個符合以下條件的列:

  • 第一列是數值類型(Int,Date,DateTime),稱之為key,
  • 其他的列是可計算的(Int,Float32/64),稱之為(values...),

然後這個嵌套表會被解釋為一個key=>(values...)的映射,當合併它們的行時,兩個數據集中的元素會被根據key合併為相應的(values...)的彙總值。如下麵的例子。

[(1, 100)] + [(2, 150)] -> [(1, 100), (2, 150)]
[(1, 100)] + [(1, 150)] -> [(1, 250)]
[(1, 100)] + [(1, 150), (2, 150)] -> [(1, 250), (2, 150)]
[(1, 100), (2, 150)] + [(1, -100)] -> [(2, 150)]

請求數據時,使用sumMap(key,value)函數來對Map進行聚合。對於嵌套數據結構,你無需在列的元組中指定列以進行彙總。

資料分享

ClickHouse經典中文文檔分享

參考文章

本文來自博客園,作者:張飛的豬,轉載請註明原文鏈接:https://www.cnblogs.com/the-pig-of-zf/p/17056317.html

公眾號:張飛的豬大數據分享,不定期分享大數據學習的總結和相關資料,歡迎關註。

個人網站"張飛的豬編程工作室"鏈接: https://zhangfeidezhu.com


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1. 生成6位數字隨機驗證碼 import random import string def num_code(length=6): """ 生成長度為length的數字隨機驗證碼 :param length: 驗證碼長度 :return: 驗證碼 """ return ''.join(random ...
  • 本篇主要介紹Java NIO的基本原理和主要組件 Netty是由JBOSS提供的Java開源網路應用程式框架,其底層是基於Java提供的NIO能力實現的。因此為了掌握Netty的底層原理,需要首先瞭解Java NIO的原理。 NIO簡介 電腦主要由CPU、記憶體、外存、IO設備等硬體組成,電腦執行 ...
  • keytool 是 Java 自帶的一個安全相關的工具,用於管理密鑰和證書;本文主要介紹其基本使用;文中所使用到的軟體版本:Java 1.8.0_321。 1、簡介 keytool 命令是一個密鑰和證書管理的工具。它允許用戶使用數字簽名管理自己的公鑰/私鑰對和相關證書,用於自我身份驗證(向其他用戶和 ...
  • 1 簡介 如果要選擇GCP為雲平臺,則經常需要創建GCE(Google Compute Engine),有以下幾種方式: (1) 在瀏覽器創建 (2) 命令 gcloud (3) Terraform 在開始之前,可以查看:《初始化一個GCP項目並用gcloud訪問操作》。 2 GCP Console ...
  • 前言 眾所周知記憶體緩存(MemoryCache)數據是從記憶體中獲取,性能表現上是最優的,但是記憶體緩存有一個缺點就是不支持分散式,數據在各個部署節點上各存一份,每份緩存的過期時間不一致,會導致幻讀等各種問題,所以我們實現分散式緩存通常會用上Redis 但如果在高併發的情況下讀取Redis的緩存,會進行 ...
  • 前言 上一篇文章我們講了怎麼使用 NET.AutoApi 這個組件來動態生成webapi介面,讓我們不需要創建控制器去轉發業務層代碼。這篇文章主要是講解NET.AutoApi 底層是怎麼實現動態生成webapi介面 我們回顧下- NET.AutoApi 最終的效果 NET.AutoApi內部原理 其 ...
  • ● 什麼是廠商和軟體商: 廠商:一般是指Centos、紅帽、ubantu、suse等等,各linux發行版操作系統的發行廠家,廠家會維護系統的軟體,做相應的測試、補丁發佈、安全更新等 軟體商:一般指各軟體發行商,例如openssh、docker、nginx、tomcat等等,他們是將自己的軟體產品進 ...
  • Elasticsearch(簡稱:ES)功能強大,其背後有很多預設值,或者預設操作。這些操作優劣並存,優勢在於我們可以迅速上手使用 ES,劣勢在於,其實這些預設值的背後涉及到很多底層原理,怎麼做更合適,只有數據使用者知道。用 ES 的話來說,你比 ES 更懂你的數據,但一些配置信息、限制信息,還是需... ...
一周排行
    -Advertisement-
    Play Games
  • MQTTnet 是一個高性能的MQTT類庫,支持.NET Core和.NET Framework。 MQTTnet 原理: MQTTnet 是一個用於.NET的高性能MQTT類庫,實現了MQTT協議的各個層級,包括連接、會話、發佈/訂閱、QoS(服務質量)等。其原理涉及以下關鍵概念: MqttCli ...
  • 在WPF中,源屬性(Source Property)指的是提供數據的屬性,通常是數據模型或者其他控制項的屬性,而目標屬性(Target Property)則是數據綁定的目標,通常是綁定到控制項的屬性,例如TextBlock的Text屬性。數據綁定將源屬性的值自動更新到目標屬性中。 主要包含以下幾個事件: ...
  • async/await 是 C# 中非同步編程的關鍵特性,它使得非同步代碼編寫更為簡單和直觀。下麵深入詳細描述了 async/await 的使用場景、優點以及一些高級使用方法,並提供了相應的實例源代碼。 使用場景: I/O 操作: 非同步編程特別適用於涉及 I/O 操作(如文件讀寫、網路請求等)的場景。在 ...
  • 使用過office的visio軟體畫圖的小伙伴都知道,畫圖軟體分為兩部分,左側圖形庫,存放各種圖標,右側是一個畫布,將左側圖形庫的圖標控制項拖拽到右側畫布,就會生成一個新的控制項,並且可以自由拖動。那如何在WPF程式中,實現類似的功能呢?今天就以一個簡單的小例子,簡述如何在WPF中實現控制項的拖拽和拖動,... ...
  • 1、Blazor Hybrid簡介 Blazor Hybrid 使開發人員能夠將桌面和移動本機客戶端框架與 .NET 和 Blazor 結合使用。在 Blazor Hybrid 應用中,Razor 組件在設備上是本機運行的。 這些組件通過本地互操作通道呈現到嵌入式 Web 視圖控制項。 組件不在瀏覽器 ...
  • 除了內置的數據集,scikit-learn還提供了隨機樣本的生成器。通過這些生成器函數,可以生成具有特定特性和分佈的隨機數據集,以幫助進行機器學習演算法的研究、測試和比較。 目前,scikit-learn庫(v1.3.0版)中有20個不同的生成樣本的函數。本篇重點介紹其中幾個具有代表性的函數。 1. ...
  • 從0到1,手把手帶你開發截圖工具ScreenCap------002實現通過文件對話框,選擇合適的文件夾,自定義預設的圖片保存位置,簡單易學 ...
  • 每次談到容器的時候,除了Docker之外,都會說起 Kubernetes,那麼什麼是 Kubernetes呢?今天就來一起學快速入門一下 Kubernetes 吧!希望本文對您有所幫助。 Kubernetes,一種用於管理和自動化雲中容器化工作負載的工具。 想象一下你有一個管弦樂隊,將每個音樂家視為 ...
  • 目錄 基本說明 安裝 Nginx 部署 VUE 前端 部署 Django 後端 Django admin 靜態文件(CSS,JS等)丟失的問題 總結 1. 基本說明 本文介紹了在 windows 伺服器下,通過 Nginx 部署 VUE + Django 前後端分離項目。本項目前端運行在 80 埠 ...
  • 從0到1,手把手帶你開發截圖工具ScreenCap------003實現最小化程式到托盤運行,- 為了方便截圖乾凈,實現最小化程式到托盤運行,簡潔,勿擾,實現最小化程式到托盤運行, 實現托盤菜單功能,實現回顯主窗體, 實現托盤開始截屏, 實現氣泡信息提示,實現托盤程式提示,實現托盤退出程式, 封裝完... ...