Clickhouse 基礎知識二(基本命令、復合數據類型、TTL、窗口函數以及Array Join)


1、基本命令

  select bar(number,0,4) from numbers(4);
    
    select now();
    
    數據導入:cat t.tsv| clickhouse-client --query "insert into t from tsv"
    數據導出:clickhouse-client --query "select * from t" > t.tsv
    
    執行多條sql:clickhouse-client -h 192.168.8.101 --multiquery --query="select 10;select 20;select 30;" 
    
    clickhouse-client  --host 192.168.8.101 --port 9000 --user default --password --database default --query "select version();select now();" --multiquery --time

2、查看數據類型和函數

    select * from system.data_type_families ; 
         
    select * from  system.functions;

3、復合數據類型

    Clickhouse提供了4種復合數據類型:
        數組Array:在同一數組內可以包含多種數據類型,但是數據類型必須要兼容;定義表的時候數組需要明確指定元素類型
            eg:select [10,200,2000.0,null] as x,toTypeName(x);
        元祖tuple: Tuple 元祖類型由1--N個元素組成,每個元素之間允許設置不同的數據類型,且彼此之間要求兼容;在表定義的時候元組也需要明確指定數據類型,且數據要嚴格匹配。
            eg:select tuple(100,'027','wuhan',now()) as x,toTypeName(x);
        枚舉Enum:枚舉固定使用(String,Int) 這種kV鍵值對的形式定義數據;1.Key 和Value是不允許重復的,要保證唯一性;2.Key 和Value的值都不允許為Null,但是Key允許為空字符串。
            eg:create table Enum(Season Enum8 (Spring=1,Summer=2,Fall=3,Winter=4))ENGINE=Memory;
                insert into Enum values('Summer');

        嵌套Nest:嵌套類型本質是一種多維數組的結構。嵌套表中的每個字段都是一個數組,並且行與行之間的數組長度無須對齊
            eg:create table nested(username String,age UInt8,sex UInt8,address Nested(id UInt8,addr String)) Engine=Memory;
               insert into nested values('clickhouse',4,1,[100,101,102],['Russia Moscow','China Beijing','China Wuhan']);
               select address.id,address.addr from nested;

4、特殊數據類型

Nullable:Nullable並不能算是一種獨立的數據類型,它更像是一種輔助的修飾符,需要與基礎數據類型搭配一起使用,表示某個基礎數據類型可以使Null值
    
    Nullable類型使用注意:
    1.只能和基本數據類型使用,不能和復合數據類型配合使用,不能作為索引字段。
    2.慎用Nullable類型,包括Nullable的數據表,不然會使查詢和寫入性能變慢。
      因為在Clickhouse每個字段的數據會存儲為Column.bin文件中,若一個列字段被Nullable類型修飾之后會額外
      生成一個Column.null.bin文件專門保存Null值。即在讀取和寫入數據的時候需要額外的文件操作。    

5、TTL定時器

在MergeTree中,可以為某個列字段或者整張表設置TTL。當時間達到時,若列字段級別的TTL 則會刪除這一列的數據;
若表級別的TTL則會刪除整張表的數據;若同時設置了列級別的和表級別的TTL則以先到期的為准 TTL time_column
+ interval 3 DAY 表示數據存活的時間為time_column 時間的3天之后。 INTERVAL支持的操作:second,minute,hour,day,week,month,quarter,year。 列級別的TTL: CREATE TABLE t_column_ttl ( `id` UInt64 COMMENT 'Primary key', `create_time` Datetime, `product_desc` String TTL create_time + toIntervalSecond(10), `product_type` UInt8 TTL create_time + toIntervalSecond(10) ) ENGINE = MergeTree PARTITION BY toYYYYMM(create_time) ORDER BY id 表級別的TTL: create table t_table_ttl( id UInt64 comment '主鍵', create_time Datetime comment '創建時間', product_desc String comment '產品描述' TTL create_time + interval 10 minute, product_type UInt8 ) engine=MergeTree partition by toYYYYMM(create_time) order by create_time TTL create_time + INTERVAL 1 MONTH , create_time + INTERVAL 1 WEEK TO VOLUME 'default', create_time + INTERVAL 2 WEEK TO DISK 'default';

6、窗口函數(window functions)

1.窗口函數:
        Online Anallytical Processing,聯機分析處理,可以對數據庫數據進行實時分析處理
    2.標准SQL語法:
        分析函數 over(partition by 列名 order by 列名 )
        eg: avg(column) over partition by column order by column
 
    3.分析函數分類:
        聚合類
            avg(列名)、sum(列名)、count(列名)、max(列名)、min(列名)
        排名類
            row_number() 按照值排序時產生一個自增編號,不會重復 rank() 按照值排序時產生一個自增編號,值相等時會重復,會產生空位 dense_rank() 按照值排序時產生一個自增編號,值相等時會重復,不會產生空位
        注意:排名類分析函數不需要任何參數。
        其他類
        lag(列名,往前的行數,[行數為null時的默認值,不指定為null]) lead(列名,往后的行數,[行數為null時的默認值,不指定為null]) ntile(n) 用於將分組數據按照順序切分成n片,返回當前切片值,如果切片不均勻,默認增加第一個切片的分布。

7、Array JOIN 子句允許在數據表的內部,與數組或者嵌套的字段進行JOIN操作,從而將一行數據變多行

 LEFT Array JOIN : 左連接
 Array JOIN : inner join 等連接

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM