Hive中的數據格式由用戶指定,須要指定三個參數:sql
語言 | HQL | SQL |
---|---|---|
數據存儲 | HDFS Hbase | Local FS |
數據格式 | 用戶自定義 | 由系統決定 |
數據更新 | 不支持(會覆蓋) | 支持 |
索引 | 有(0.8版後新增) | 有 |
執行 | MR | Executor |
執行延遲 | 高 | 低 |
可擴展性 | 高(UDF、UDAF、UDTF) | 低 |
數據規模 | 大(數據大於TB) | 小 |
數據檢查 | 讀時模式 | 寫時模式 |
//建內部表 create table inner_test (name String) row format delimited fields terminated by '\n'; //導入數據 load data local inpath 'local/path' into table inner_test;
//建外部表 create external table external_test (name String) row format delimited fields terminated by '\n' -- stored as textfile location 'local/path';//必須是文件
Hive中,分區表的一個partition對應於表下的一個目錄,全部partition數據都存儲在對應的目錄中架構
如:表 tablea 中有兩個分區 p1 和 p2,則:app
對應的 p1='aaa',p2='111' 的目錄爲: xxx/tablea/p1=aaa/p2=111; 對應的 p1='aaa',p2='222' 的目錄爲: xxx/tablea/p1=aaa/p2=222;
//建分區表,按dt分區 create table partition_test (name String) partitioned by (dt String) row format delimited fields terminated by '\n'; //插入數據 insert overwrite table partition_test partition (dt='xxx') select * from partition_from limit 1000; //查看分區表分區信息 show partitions partition_test; //通常狀況下,分區表數據由定時任務插入
分桶SQL:ide
//建分桶表 create table bucket_test (num int) clustered by (num) into 32 buckets;
分桶主要做用:函數
SQLoop
select * from bucket_test tablesample (bucket 1 out of 32 on 32) ;
咱們假設分桶表 bucket_test 裏的數據是 '1,2,3,4,5,6,7...32', 那麼,執行上面 sql 後會返回什麼呢?
運用採樣公式,得知:共有 32 個桶,會從第一個桶開始取數據,共取 32/32=1 個數據。而桶的下標是從 0 開始的,則得出採樣結果: 32(第一個桶(下標爲0)內的數據是 32 )。
咱們換一下采樣sql,改成:tablesample(bucket 1 out of 16 on 32);
結果會是什麼?
一樣,利用採樣公式得知:共有 32 個桶,會從第一個桶開始取數據,共取 32/16=2 個數據。一個桶內只有一個數據,那麼,另外一個數據取哪一個桶裏的呢?
咱們能夠將桶分爲兩部分,每部分 16 個,因此,取每部分的第一個桶,對應到 32 個桶上,就是第一個和第十七個,即:3二、16。code
沒有分桶的表,如何採樣90%的數據?regexp
select * from tablename where num % 10 > 0; //若是是字符串的話,須要先 hash 轉成數字。
設置參數:orm
partition by:須要搭配 over 使用,原來數據有多少條 user_id ,結果還有多少條排序
select user_id, count(order_id) over(partition by user_id) from orders;
group by:因爲聚合,最終一個 user_id 只有一條數據
select user_id, count(order_id) from orders group by user_id;