醫(yī)療網(wǎng)站做藥品是干嘛搜索引擎營(yíng)銷的案例有哪些
官網(wǎng)
ClickHouse release 24.1, 2024-01-30
以毫秒為單位查詢數(shù)十億行
ClickHouse是用于實(shí)時(shí)應(yīng)用和分析的最快、資源效率最高的開源數(shù)據(jù)庫(kù)。
安裝ClickHouse
使用ClickHouse,你有三個(gè)選擇:
- ClickHouse云:官方ClickHouse作為一項(xiàng)服務(wù),-由ClickHouse的創(chuàng)建者構(gòu)建,維護(hù)和支持
- 快速安裝:一個(gè)易于下載的二進(jìn)制測(cè)試和開發(fā)與ClickHouse
- 生產(chǎn)部署:ClickHouse可以運(yùn)行在任何Linux, FreeBSD,或macOS與x86-64, ARM,或PowerPC64LE CPU架構(gòu)
- Docker鏡像:使用Docker Hub中的官方Docker鏡像
1、什么是ClickHouse?
ClickHouse?是一個(gè)高性能,面向列的SQL數(shù)據(jù)庫(kù)管理系統(tǒng)(DBMS),用于在線分析處理(OLAP)。它既可以作為開源軟件,也可以作為云服務(wù)。
1.1 什么是OLAP?
OLAP場(chǎng)景需要在大型數(shù)據(jù)集之上的實(shí)時(shí)響應(yīng),用于具有以下特征的復(fù)雜分析查詢:
- 數(shù)據(jù)集可以是巨大的——數(shù)十億或數(shù)萬億行
- 數(shù)據(jù)組織在包含許多列的表中
- 只選擇幾個(gè)列來回答任何特定的查詢
- 結(jié)果必須以毫秒或秒為單位返回
1.2 面向列與面向行數(shù)據(jù)庫(kù)
在面向行的DBMS中,數(shù)據(jù)以行為單位存儲(chǔ),與一行相關(guān)的所有值在物理上彼此相鄰存儲(chǔ)。
在面向列的DBMS中,數(shù)據(jù)存儲(chǔ)在列中,來自相同列的值存儲(chǔ)在一起。
1.3 為什么面向列的數(shù)據(jù)庫(kù)在OLAP場(chǎng)景中工作得更好
面向列的數(shù)據(jù)庫(kù)更適合OLAP場(chǎng)景:它們?cè)谔幚泶蠖鄶?shù)查詢時(shí)至少快100倍
1.4 為什么ClickHouse這么快?
ClickHouse使用所有可用的系統(tǒng)資源來充分發(fā)揮其潛力,以盡可能快地處理每個(gè)分析查詢。這是由于分析功能和對(duì)實(shí)現(xiàn)最快的OLAP數(shù)據(jù)庫(kù)所需的底層細(xì)節(jié)的關(guān)注的獨(dú)特組合而成為可能的。
深入了解這個(gè)主題的有用文章包括:
- ClickHouse Performance
- Distinctive Features of ClickHouse
- FAQ: Why is ClickHouse so fast?
1.5 實(shí)時(shí)處理分析查詢
在面向行的DBMS中,數(shù)據(jù)是按以下順序存儲(chǔ)的:
換句話說,與一行相關(guān)的所有值在物理上都是挨個(gè)存儲(chǔ)的。
面向行的DBMS的例子有MySQL、Postgres和MS SQL Server。
在面向列的DBMS中,數(shù)據(jù)是這樣存儲(chǔ)的:
這些例子只顯示了數(shù)據(jù)排列的順序。來自不同列的值被分開存儲(chǔ),來自同一列的數(shù)據(jù)被一起存儲(chǔ)。
面向列DBMS的例子:Vertica, Paraccel (Actian Matrix和Amazon Redshift), Sybase IQ, Exasol, Infobright, InfiniDB, MonetDB (VectorWise和Actian Vector), LucidDB, SAP HANA, Google Dremel, Google PowerDrill, Druid和kdb+。
不同的數(shù)據(jù)存儲(chǔ)順序更適合不同的場(chǎng)景。數(shù)據(jù)訪問場(chǎng)景指的是進(jìn)行什么查詢、查詢的頻率和比例;每種查詢類型要讀取多少數(shù)據(jù)——行、列和字節(jié);讀取和更新數(shù)據(jù)的關(guān)系;數(shù)據(jù)的工作大小以及如何在本地使用它;是否使用事務(wù),以及它們的隔離程度;數(shù)據(jù)復(fù)制和邏輯完整性要求;對(duì)每種查詢類型的延遲和吞吐量的需求,等等。
系統(tǒng)負(fù)載越高,定制系統(tǒng)設(shè)置以匹配使用場(chǎng)景的需求就越重要,定制的粒度也就越細(xì)。沒有一個(gè)系統(tǒng)能同樣適合于不同的場(chǎng)景。如果系統(tǒng)能夠適應(yīng)廣泛的場(chǎng)景,那么在高負(fù)載下,系統(tǒng)處理所有場(chǎng)景的能力都很差,或者只能很好地處理一個(gè)或幾個(gè)可能的場(chǎng)景。
OLAP場(chǎng)景的關(guān)鍵屬性
- 表是“寬”的,這意味著它們包含大量的列。
- 數(shù)據(jù)集很大,查詢?cè)谔幚韱蝹€(gè)查詢時(shí)需要高吞吐量(每臺(tái)服務(wù)器每秒多達(dá)數(shù)十億行)。
- 列值相當(dāng)小:數(shù)字和短字符串(例如,每個(gè)URL 60字節(jié))。
- 查詢提取大量行,但只提取一小部分列。
- 對(duì)于簡(jiǎn)單的查詢,允許大約50毫秒的延遲。
- 每個(gè)查詢都有一個(gè)大表;所有的表都很小,除了一張。
- 查詢結(jié)果明顯小于源數(shù)據(jù)。換句話說,數(shù)據(jù)被過濾或聚合,因此結(jié)果適合單個(gè)服務(wù)器的RAM。
- 查詢相對(duì)較少(通常每個(gè)服務(wù)器每秒有數(shù)百個(gè)或更少的查詢)。
- 插入以相當(dāng)大的批量(> 1000行)進(jìn)行,而不是以單行進(jìn)行。
- 事務(wù)是不必要的。
很容易看出,OLAP場(chǎng)景與其他流行的場(chǎng)景(如OLTP或Key-Value訪問)非常不同。因此,如果您想獲得良好的性能,嘗試使用OLTP或Key-Value DB來處理分析查詢是沒有意義的。例如,如果您嘗試使用MongoDB或Redis進(jìn)行分析,那么與OLAP數(shù)據(jù)庫(kù)相比,您將獲得非常差的性能。
輸入輸出
1)對(duì)于分析查詢,只需要讀取少量的表列。在面向列的數(shù)據(jù)庫(kù)中,您可以只讀取所需的數(shù)據(jù)。例如,如果您需要100列中的5列,那么I/O可以減少20倍。
2)由于數(shù)據(jù)是以塊(packets)的形式讀取的,因此更容易壓縮。列中的數(shù)據(jù)也更容易壓縮。這進(jìn)一步減少了I/O量。
3)由于減少了I/O,更多的數(shù)據(jù)可以放入系統(tǒng)緩存。
例如,查詢“計(jì)數(shù)每個(gè)廣告平臺(tái)的記錄數(shù)”需要讀取一個(gè)“廣告平臺(tái)ID”列,該列未壓縮占用1字節(jié)。如果大多數(shù)流量不是來自廣告平臺(tái),你可以預(yù)期這個(gè)專欄的壓縮至少是原來的10倍。當(dāng)使用快速壓縮算法時(shí),可以以每秒至少幾gb的未壓縮數(shù)據(jù)的速度進(jìn)行數(shù)據(jù)解壓縮。換句話說,該查詢可以在單個(gè)服務(wù)器上以大約每秒幾十億行的速度處理。這個(gè)速度實(shí)際上是在實(shí)踐中達(dá)到的。
CPU
由于執(zhí)行查詢需要處理大量行,因此可以為整個(gè)向量(vectors )而不是單獨(dú)的行分派所有操作,或者實(shí)現(xiàn)查詢引擎,以便幾乎沒有分派成本。如果不這樣做,對(duì)于任何不太好的磁盤子系統(tǒng),查詢解釋器不可避免地會(huì)使CPU停滯。在列中存儲(chǔ)數(shù)據(jù)和在可能的情況下按列處理數(shù)據(jù)是有意義的。
有兩種方法:
1)矢量引擎。所有的操作都是針對(duì)向量編寫的,而不是針對(duì)單獨(dú)的值。這意味著您不需要經(jīng)常調(diào)用操作,并且調(diào)度成本可以忽略不計(jì)。操作代碼包含一個(gè)優(yōu)化的內(nèi)部循環(huán)。
2)代碼生成。為查詢生成的代碼包含所有間接調(diào)用。
在面向行的數(shù)據(jù)庫(kù)中不會(huì)這樣做,因?yàn)樵谶\(yùn)行簡(jiǎn)單查詢時(shí),這樣做沒有意義。然而,也有例外。例如,MemSQL使用代碼生成來減少處理SQL查詢時(shí)的延遲。(相比之下,分析型DBMS需要優(yōu)化吞吐量,而不是延遲。)
注意,為了提高CPU效率,查詢語言必須是聲明式的(SQL或MDX),或者至少是向量(J, K)。查詢應(yīng)該只包含隱式循環(huán),以便進(jìn)行優(yōu)化。
2、Quick Start
2.1 下載二進(jìn)制文件
ClickHouse本機(jī)運(yùn)行在Linux、FreeBSD和macOS上,并通過WSL運(yùn)行在Windows上。在本地下載ClickHouse的最簡(jiǎn)單方法是運(yùn)行以下curl
命令。它決定你的操作系統(tǒng)是否被支持,然后下載一個(gè)合適的ClickHouse二進(jìn)制文件:
curl https://clickhouse.com/ | sh# 安裝./clickhouse installStart clickhouse-server with:sudo clickhouse startStart clickhouse-client with:clickhouse-client --password
2.2 啟動(dòng)服務(wù)器
運(yùn)行如下命令啟動(dòng)ClickHouse服務(wù):
./clickhouse server
2.3 啟動(dòng)客戶端
使用ClickHouse -client連接到ClickHouse服務(wù)。打開一個(gè)新的終端,更改clickhouse二進(jìn)制文件的保存目錄,并運(yùn)行以下命令:
./clickhouse client
當(dāng)它連接到本地主機(jī)上運(yùn)行的服務(wù)時(shí),你應(yīng)該看到一個(gè)笑臉:
my-host :)
2.4 創(chuàng)建表
使用CREATE TABLE
定義一個(gè)新表。典型的SQL DDL命令與一個(gè)添加可以工作在ClickHouse-表在ClickHouse需要一個(gè)ENGINE
子句。使用MergeTree
來利用ClickHouse的性能優(yōu)勢(shì):
CREATE TABLE my_first_table
(user_id UInt32,message String,timestamp DateTime,metric Float32
)
ENGINE = MergeTree
PRIMARY KEY (user_id, timestamp)
2.5 插入數(shù)據(jù)
您可以在ClickHouse中使用熟悉的INSERT INTO TABLE
命令,但重要的是要了解,每次插入到MergeTree
表中都會(huì)導(dǎo)致在存儲(chǔ)中創(chuàng)建一個(gè)part
(文件夾)。為了最小化parts,一次批量插入許多行(一次插入數(shù)萬甚至數(shù)百萬行)。
INSERT INTO my_first_table (user_id, message, timestamp, metric) VALUES(101, 'Hello, ClickHouse!', now(), -1.0 ),(102, 'Insert a lot of rows per batch', yesterday(), 1.41421 ),(102, 'Sort your data based on your commonly-used queries', today(), 2.718 ),(101, 'Granules are the smallest chunks of data read', now() + 5, 3.14159 )
2.6 查詢新表
你可以寫一個(gè)SELECT
查詢,就像你會(huì)用任何SQL數(shù)據(jù)庫(kù):
SELECT *FROM my_first_tableORDER BY timestamp
注意,響應(yīng)以一個(gè)漂亮的表格格式返回:
2.7 插入自己的數(shù)據(jù)
下一步是將你當(dāng)前的數(shù)據(jù)輸入ClickHouse。我們有很多表函數(shù)和集成來獲取數(shù)據(jù)。我們?cè)谙旅娴倪x項(xiàng)卡中有一些例子,或者查看我們的集成列表,了解與ClickHouse集成的一長(zhǎng)串技術(shù)。
下一步?
- 查看高級(jí)教程,深入了解ClickHouse的關(guān)鍵概念和功能
- 通過參加ClickHouse Academy的免費(fèi)點(diǎn)播培訓(xùn)課程繼續(xù)學(xué)習(xí)
- 我們有一個(gè)示例數(shù)據(jù)集的列表,并說明如何插入它們
- 如果您的數(shù)據(jù)來自外部源,請(qǐng)查看我們的集成指南集,了解如何連接到消息隊(duì)列、數(shù)據(jù)庫(kù)、管道等
- 如果您使用的是UI/BI可視化工具,請(qǐng)查看連接UI到ClickHouse的-用戶指南
- 關(guān)于主鍵的用戶指南是您需要了解的關(guān)于主鍵以及如何定義它們的所有內(nèi)容
3、高級(jí)教程
在本教程中,您將創(chuàng)建一個(gè)表并插入一個(gè)大型數(shù)據(jù)集(200萬行紐約出租車數(shù)據(jù))。然后,您將在數(shù)據(jù)集上運(yùn)行查詢,包括如何創(chuàng)建字典并使用它執(zhí)行JOIN的示例。
3.1 創(chuàng)建一個(gè)新表
紐約市的出租車數(shù)據(jù)包含數(shù)百萬次出租車出行的詳細(xì)信息,包括接送時(shí)間和地點(diǎn)、成本、小費(fèi)金額、通行費(fèi)、付款類型等列。讓我們創(chuàng)建一個(gè)表來存儲(chǔ)這些數(shù)據(jù)…
連接到SQL控制臺(tái)
在default
數(shù)據(jù)庫(kù)中創(chuàng)建如下trips
表:
CREATE TABLE trips
(`trip_id` UInt32,`vendor_id` Enum8('1' = 1, '2' = 2, '3' = 3, '4' = 4, 'CMT' = 5, 'VTS' = 6, 'DDS' = 7, 'B02512' = 10, 'B02598' = 11, 'B02617' = 12, 'B02682' = 13, 'B02764' = 14, '' = 15),`pickup_date` Date,`pickup_datetime` DateTime,`dropoff_date` Date,`dropoff_datetime` DateTime,`store_and_fwd_flag` UInt8,`rate_code_id` UInt8,`pickup_longitude` Float64,`pickup_latitude` Float64,`dropoff_longitude` Float64,`dropoff_latitude` Float64,`passenger_count` UInt8,`trip_distance` Float64,`fare_amount` Float32,`extra` Float32,`mta_tax` Float32,`tip_amount` Float32,`tolls_amount` Float32,`ehail_fee` Float32,`improvement_surcharge` Float32,`total_amount` Float32,`payment_type` Enum8('UNK' = 0, 'CSH' = 1, 'CRE' = 2, 'NOC' = 3, 'DIS' = 4),`trip_type` UInt8,`pickup` FixedString(25),`dropoff` FixedString(25),`cab_type` Enum8('yellow' = 1, 'green' = 2, 'uber' = 3),`pickup_nyct2010_gid` Int8,`pickup_ctlabel` Float32,`pickup_borocode` Int8,`pickup_ct2010` String,`pickup_boroct2010` String,`pickup_cdeligibil` String,`pickup_ntacode` FixedString(4),`pickup_ntaname` String,`pickup_puma` UInt16,`dropoff_nyct2010_gid` UInt8,`dropoff_ctlabel` Float32,`dropoff_borocode` UInt8,`dropoff_ct2010` String,`dropoff_boroct2010` String,`dropoff_cdeligibil` String,`dropoff_ntacode` FixedString(4),`dropoff_ntaname` String,`dropoff_puma` UInt16
)
ENGINE = MergeTree
PARTITION BY toYYYYMM(pickup_date)
ORDER BY pickup_datetime;
3.2 插入數(shù)據(jù)集
現(xiàn)在已經(jīng)創(chuàng)建了一個(gè)表,讓我們添加NYC出租車數(shù)據(jù)。它在S3中的CSV文件中,您可以從那里加載數(shù)據(jù)。
1)下面的命令將來自S3中兩個(gè)不同文件的~2,000,000行插入到trips
表中:
trips_1.tsv.gz
and trips_2.tsv.gz
INSERT INTO trips
SELECT * FROM s3('https://datasets-documentation.s3.eu-west-3.amazonaws.com/nyc-taxi/trips_{1..2}.gz','TabSeparatedWithNames', "`trip_id` UInt32,`vendor_id` Enum8('1' = 1, '2' = 2, '3' = 3, '4' = 4, 'CMT' = 5, 'VTS' = 6, 'DDS' = 7, 'B02512' = 10, 'B02598' = 11, 'B02617' = 12, 'B02682' = 13, 'B02764' = 14, '' = 15),`pickup_date` Date,`pickup_datetime` DateTime,`dropoff_date` Date,`dropoff_datetime` DateTime,`store_and_fwd_flag` UInt8,`rate_code_id` UInt8,`pickup_longitude` Float64,`pickup_latitude` Float64,`dropoff_longitude` Float64,`dropoff_latitude` Float64,`passenger_count` UInt8,`trip_distance` Float64,`fare_amount` Float32,`extra` Float32,`mta_tax` Float32,`tip_amount` Float32,`tolls_amount` Float32,`ehail_fee` Float32,`improvement_surcharge` Float32,`total_amount` Float32,`payment_type` Enum8('UNK' = 0, 'CSH' = 1, 'CRE' = 2, 'NOC' = 3, 'DIS' = 4),`trip_type` UInt8,`pickup` FixedString(25),`dropoff` FixedString(25),`cab_type` Enum8('yellow' = 1, 'green' = 2, 'uber' = 3),`pickup_nyct2010_gid` Int8,`pickup_ctlabel` Float32,`pickup_borocode` Int8,`pickup_ct2010` String,`pickup_boroct2010` String,`pickup_cdeligibil` String,`pickup_ntacode` FixedString(4),`pickup_ntaname` String,`pickup_puma` UInt16,`dropoff_nyct2010_gid` UInt8,`dropoff_ctlabel` Float32,`dropoff_borocode` UInt8,`dropoff_ct2010` String,`dropoff_boroct2010` String,`dropoff_cdeligibil` String,`dropoff_ntacode` FixedString(4),`dropoff_ntaname` String,`dropoff_puma` UInt16
") SETTINGS input_format_try_infer_datetimes = 0
2)等待INSERT操作完成——下載150mb的數(shù)據(jù)可能需要一些時(shí)間。
s3函數(shù)很聰明地知道如何解壓縮數(shù)據(jù),TabSeparatedWithNames格式告訴ClickHouse數(shù)據(jù)是用制表符分隔的,并跳過每個(gè)文件的標(biāo)題行。
3)當(dāng)插入完成后,驗(yàn)證它是否工作:
SELECT count() FROM trips
您應(yīng)該看到大約2M行(準(zhǔn)確地說是1,999,657行)。
注意ClickHouse需要處理的行數(shù)和速度有多快?只需處理6行,就可以在0.001秒內(nèi)得到計(jì)數(shù)。(6恰好是trips
表當(dāng)前擁有的parts
數(shù),部件知道它們有多少行。)
4)如果你運(yùn)行一個(gè)需要訪問每一行的查詢,你會(huì)注意到需要處理更多的行,但運(yùn)行時(shí)間仍然非???
SELECT DISTINCT(pickup_ntaname) FROM trips
該查詢必須處理2M行并返回190個(gè)值,但請(qǐng)注意,它在大約1秒內(nèi)完成了此操作。pickup_ntaname
列表示出租車在紐約市的開始地。
3.3 分析數(shù)據(jù)
讓我們運(yùn)行一些查詢來分析這2M行數(shù)據(jù)…
1)我們將從一些簡(jiǎn)單的計(jì)算開始,比如計(jì)算平均小費(fèi)金額:
SELECT round(avg(tip_amount), 2) FROM trips
2)下面的查詢基于乘客數(shù)量計(jì)算平均成本:
SELECTpassenger_count,ceil(avg(total_amount),2) AS average_total_amount
FROM trips
GROUP BY passenger_count
3)下面是一個(gè)查詢,計(jì)算每個(gè)社區(qū)每天的接送次數(shù):
SELECTpickup_date,pickup_ntaname,SUM(1) AS number_of_trips
FROM trips
GROUP BY pickup_date, pickup_ntaname
ORDER BY pickup_date ASC
4)該查詢計(jì)算行程長(zhǎng)度,并根據(jù)該值對(duì)結(jié)果進(jìn)行分組:
SELECTavg(tip_amount) AS avg_tip,avg(fare_amount) AS avg_fare,avg(passenger_count) AS avg_passenger,count() AS count,truncate(date_diff('second', pickup_datetime, dropoff_datetime)/60) as trip_minutes
FROM trips
WHERE trip_minutes > 0
GROUP BY trip_minutes
ORDER BY trip_minutes DESC
5)這個(gè)查詢顯示了每個(gè)社區(qū)的接送次數(shù),按小時(shí)分列:
SELECTpickup_ntaname,toHour(pickup_datetime) as pickup_hour,SUM(1) AS pickups
FROM trips
WHERE pickup_ntaname != ''
GROUP BY pickup_ntaname, pickup_hour
ORDER BY pickup_ntaname, pickup_hour
3.4 創(chuàng)建字典
如果你是ClickHouse的新手,了解字典(dictionaries
)的工作原理是很重要的。考慮字典的一種簡(jiǎn)單方法是存儲(chǔ)在內(nèi)存中的鍵->值對(duì)的映射。詳細(xì)信息和字典的所有選項(xiàng)鏈接在本教程的末尾。
1)讓我們看看如何在ClickHouse服務(wù)中創(chuàng)建與表關(guān)聯(lián)的字典。表和字典將基于包含265行的CSV文件,其中一行代表紐約市的每個(gè)社區(qū)。這些社區(qū)被映射到紐約市的行政區(qū)名稱(紐約市有5個(gè)行政區(qū):布朗克斯、布魯克林、曼哈頓、皇后區(qū)和斯塔頓島),這個(gè)文件也將紐瓦克機(jī)場(chǎng)(EWR)列為一個(gè)行政區(qū)。
這是CSV文件的一部分(為清晰起見顯示為表格)。文件中的LocationID
列映射到trips
表中的pickup_nyct2010_gid
和dropff_nyct2010_gid
列:
2)該文件的URL為https://datasets-documentation.s3.eu-west-3.amazonaws.com/nyc-taxi/taxi_zone_lookup.csv。運(yùn)行以下SQL語句,創(chuàng)建一個(gè)名為taxi_zone_dictionary
的字典,并從S3中的CSV文件填充字典:
CREATE DICTIONARY taxi_zone_dictionary
(`LocationID` UInt16 DEFAULT 0,`Borough` String,`Zone` String,`service_zone` String
)
PRIMARY KEY LocationID
SOURCE(HTTP(URL 'https://datasets-documentation.s3.eu-west-3.amazonaws.com/nyc-taxi/taxi_zone_lookup.csv' FORMAT 'CSVWithNames'))
LIFETIME(MIN 0 MAX 0)
LAYOUT(HASHED_ARRAY())
將
LIFETIME
設(shè)置為0意味著此字典將永遠(yuǎn)不會(huì)更新其源。這里使用它來避免向S3存儲(chǔ)桶發(fā)送不必要的流量,但通常您可以指定任何您喜歡的生命周期值。
例如:
LIFETIME(MIN 1 MAX 10)
指定要在1到10秒之間的隨機(jī)時(shí)間之后更新的字典。(當(dāng)在大量服務(wù)器上更新時(shí),為了在字典源上分配負(fù)載,隨機(jī)時(shí)間是必要的。)
3)驗(yàn)證它的工作-你應(yīng)該得到265行(每個(gè)鄰居一行):
SELECT * FROM taxi_zone_dictionary
4)使用dictGet
函數(shù)(或其變體)從字典中檢索值。傳入字典的名稱、所需的值和鍵(在我們的示例中是taxxi_zone_dictionary
的LocationID
列)。
例如,下面的查詢返回LocationID
為132的Borough
(如上所示為JFK機(jī)場(chǎng)):
SELECT dictGet('taxi_zone_dictionary', 'Borough', 132)
5)使用dictHas
函數(shù)查看字典中是否存在鍵。例如,下面的查詢返回1(在ClickHouse中為“true”):
SELECT dictHas('taxi_zone_dictionary', 132)
6)下面的查詢返回0,因?yàn)?567不是字典中LocationID
的值:
SELECT dictHas('taxi_zone_dictionary', 4567)
7)使用dictGet
函數(shù)在查詢中檢索市鎮(zhèn)的名稱。例如:
SELECTcount(1) AS total,dictGetOrDefault('taxi_zone_dictionary','Borough', toUInt64(pickup_nyct2010_gid), 'Unknown') AS borough_name
FROM trips
WHERE dropoff_nyct2010_gid = 132 OR dropoff_nyct2010_gid = 138
GROUP BY borough_name
ORDER BY total DESC
這個(gè)查詢匯總了每個(gè)行政區(qū)在拉瓜迪亞機(jī)場(chǎng)或肯尼迪機(jī)場(chǎng)結(jié)束的出租車次數(shù)。結(jié)果如下所示,請(qǐng)注意,有相當(dāng)多的行程的落點(diǎn)是未知的:
3.5 執(zhí)行 Join
讓我們編寫一些查詢,將tax_zone_dictionary
與trips
表連接起來。
1)我們可以從一個(gè)簡(jiǎn)單的JOIN開始,它的作用類似于上面的機(jī)場(chǎng)查詢:
SELECTcount(1) AS total,Borough
FROM trips
JOIN taxi_zone_dictionary ON toUInt64(trips.pickup_nyct2010_gid) = taxi_zone_dictionary.LocationID
WHERE dropoff_nyct2010_gid = 132 OR dropoff_nyct2010_gid = 138
GROUP BY Borough
ORDER BY total DESC
注意,上面
JOIN
查詢的輸出與之前使用dictGetOrDefault
的查詢相同(只是不包括Unknown
值)。在幕后,ClickHouse實(shí)際上調(diào)用了taxxi_zone_dictionary
字典的dictGet
函數(shù),但是SQL開發(fā)人員更熟悉JOIN
語法。
2)我們不經(jīng)常在ClickHouse中使用SELECT *
-你應(yīng)該只檢索你實(shí)際需要的列!但是很難找到一個(gè)花費(fèi)很長(zhǎng)時(shí)間的查詢,所以這個(gè)查詢故意選擇每一列并返回每一行(除了在默認(rèn)情況下響應(yīng)中有一個(gè)內(nèi)置的10,000行最大值),并且還使用字典對(duì)每一行進(jìn)行右連接:
SELECT *
FROM trips
JOIN taxi_zone_dictionaryON trips.dropoff_nyct2010_gid = taxi_zone_dictionary.LocationID
WHERE tip_amount > 0
ORDER BY tip_amount DESC
LIMIT 1000
恭喜!
做得好——你完成了教程,希望你對(duì)如何使用ClickHouse有了更好的理解。下面是接下來該怎么做的一些選擇:
- 閱讀ClickHouse的主鍵是如何工作的——這些知識(shí)將使你在成為ClickHouse專家的過程中有很長(zhǎng)的路要走
- 集成外部數(shù)據(jù)源,如文件、Kafka、PostgreSQL、數(shù)據(jù)管道或許多其他數(shù)據(jù)源
- 連接您最喜歡的UI/BI工具到ClickHouse
- 查看SQL參考并瀏覽各種函數(shù)。ClickHouse有一個(gè)驚人的功能集合,用于轉(zhuǎn)換,處理和分析數(shù)據(jù)
- 了解更多字典