當前位置:首頁 » 編程語言 » hivesql工具
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

hivesql工具

發布時間: 2022-10-04 10:39:09

㈠ 一般數據分析師常用的工具有哪些

①數據處理工具:Excel


在Excel,需要重點了解數據處理的重要技巧及函數的應用,特別是數據清理技術的應用。這項運用能對數據去偽存真,掌握數據主動權,全面掌控數據;Excel數據透視表的應用重在挖掘隱藏的數據價值,輕松整合海量數據:各種圖表類型的製作技巧及Power Query、Power Pivot的應用可展現數據可視化效果,讓數據說話。


資料庫:Mysql


Excel如果能夠玩的很轉,能勝任一部分數據量不是很大的公司。但是基於Excel處理數據能力有限,如果想勝任中型的互聯網公司中數據分析崗位還是比較困難。因此需要學會資料庫技術,一般Mysql。你需要了解MySQL管理工具的使用以及資料庫的基本操作;數據表的基本操作、MySQL的數據類型和運算符、MySQL函數、查詢語句、存儲過程與函數、觸發程序以及視圖等。比較高階的需要學習MySQL的備份和恢復;熟悉完整的MySQL數據系統開發流程。


③數據可視化:Tableau & Echarts


目前比較流行的商業數據可視化工具是Tableau & Echarts。Echarts是開源的,代碼可以自己改,種類也非常豐富。


④大數據分析:SPSS & Python& HiveSQL 等


如果說Excel是“輕數據處理工具”,Mysql是“中型數據處理工具”那麼,大數據分析,涉及的面就非常廣泛,技術點涉及的也比較多。

㈡ 使用Hive SQL插入動態分區的Parquet表OOM異常分析

1.異常描述

當運行「INSERT ... SELECT」語句向 Parquet 或者 ORC 格式的表中插入數據時,如果啟用了動態分區,你可能會碰到以下錯誤,而導致作業無法正常執行。

Hive 客戶端:

(可左右滑動)

YARN 的 8088 中查看具體 map task 報錯:

(可左右滑動)

2.異常分析

Parquet 和 ORC 是列式批處理文件格式。這些格式要求在寫入文件之前將批次的行(batches of rows)緩存在內存中。在執行 INSERT 語句時,動態分區目前的實現是:至少為每個動態分區目錄打開一個文件寫入器(file writer)。由於這些緩沖區是按分區維護的,因此在運行時所需的內存量隨著分區數量的增加而增加。所以經常會導致 mappers 或 recers 的 OOM,具體取決於打開的文件寫入器(file writer)的數量。

通過 INSERT 語句插入數據到動態分區表中,也可能會超過 HDFS 同時打開文件數的限制。

如果沒有 join 或聚合,INSERT ... SELECT 語句會被轉換為只有 map 任務的作業。mapper 任務會讀取輸入記錄然後將它們發送到目標分區目錄。在這種情況下,每個 mapper 必須為遇到的每個動態分區創建一個新的文件寫入器(file writer)。mapper 在運行時所需的內存量隨著它遇到的分區數量的增加而增加。

3.異常重現與解決

3.1.生成動態分區的幾個參數說明

hive.exec.dynamic.partition

默認值:false

是否開啟動態分區功能,默認 false 關閉。

使用動態分區時候,該參數必須設置成 true;

hive.exec.dynamic.partition.mode

默認值:strict

動態分區的模式,默認 strict,表示必須指定至少一個分區為靜態分區,nonstrict 模式表示允許所有的分區欄位都可以使用動態分區。

一般需要設置為 nonstrict

hive.exec.max.dynamic.partitions.pernode

默認值:100

在每個執行 MR 的節點上,最大可以創建多少個動態分區。

該參數需要根據實際的數據來設定。

比如:源數據中包含了一年的數據,即 day 欄位有 365 個值,那麼該參數就需要設置成大於 365,如果使用默認值 100,則會報錯。

hive.exec.max.dynamic.partitions

默認值:1000

在所有執行 MR 的節點上,最大一共可以創建多少個動態分區。

同上參數解釋。

hive.exec.max.created.files

默認值:100000

整個 MR Job 中,最大可以創建多少個 HDFS 文件。

一般默認值足夠了,除非你的數據量非常大,需要創建的文件數大於 100000,可根據實際情況加以調整。

maprece.map.memory.mb

map 任務的物理內存分配值,常見設置為 1GB,2GB,4GB 等。

maprece.map.java.opts

map 任務的 Java 堆棧大小設置,一般設置為小於等於上面那個值的 75%,這樣可以保證 map 任務有足夠的堆棧外內存空間。

maprece.input.fileinputformat.split.maxsize

maprece.input.fileinputformat.split.minsize

這個兩個參數聯合起來用,主要是為了方便控制 maprece 的 map 數量。比如我設置為 1073741824,就是為了讓每個 map 處理 1GB 的文件。

3.2.一個例子

Fayson 在前兩天給人調一個使用 Hive SQL 插入動態分區的 Parquet 表時,總是報錯 OOM,也是折騰了很久。以下我們來看看整個過程。

1.首先我們看看執行腳本的內容,基本其實就是使用 Hive 的 insert 語句將文本數據表插入到另外一張 parquet 表中,當然使用了動態分區。

2.我們看看原始數據文件,是文本文件,一共 120 個,每個 30GB 大小,總共差不多 3.6TB。

3.我們看看報錯

4.因為是一個只有 map 的 maprece 任務,當我們從 YARN 的 8088 觀察這個作業時可以發現,基本沒有一個 map 能夠執行成功,全部都是失敗的。報上面的錯誤。

5.把 maprece.map.memory.mb 從 2GB 增大到 4GB,8GB,16GB,相應 maprece.map.java.opts 增大到 3GB,6GB,12GB。依舊報錯 OOM。

6.後面又將 maprece.input.fileinputformat.split.maxsize 從 1GB,減少為 512MB,256MB,從而增大 map 數量,縮小單個 map 處理文件的大小。依舊報錯 OOM。

7.最後啟用 hive.optimize.sort.dynamic.partition,增加 rece 過程,作業執行成功。

8.最後查看結果文件大約 1.2TB,約為輸入文件的三分之一。一共 1557 個分區,最大的分區文件為 2GB。

4.異常總結

對於這個異常,我們建議有以下三種方式來處理:

1.啟用 hive.optimize.sort.dynamic.partition,將其設置為 true。通過這個優化,這個只有 map 任務的 maprece 會引入 rece 過程,這樣動態分區的那個欄位比如日期在傳到 recer 時會被排序。由於分區欄位是排序的,因此每個 recer 只需要保持一個文件寫入器(file writer)隨時處於打開狀態,在收到來自特定分區的所有行後,關閉記錄寫入器(record writer),從而減小內存壓力。這種優化方式在寫 parquet 文件時使用的內存要相對少一些,但代價是要對分區欄位進行排序。

2.第二種方式就是增加每個 mapper 的內存分配,即增大 maprece.map.memory.mb 和 maprece.map.java.opts,這樣所有文件寫入器(filewriter)緩沖區對應的內存會更充沛。

3.將查詢分解為幾個較小的查詢,以減少每個查詢創建的分區數量。這樣可以讓每個 mapper 打開較少的文件寫入器(file writer)。

備註:

默認情況下,Hive 為每個打開的 Parquet 文件緩沖區(file buffer)分配 128MB。這個 buffer 大小由參數 parquet.block.size 控制。為獲得最佳性能,parquet 的 buffer size 需要與 HDFS 的 block size 保持對齊(比如相等),從而使每個 parquet 文件在單個 HDFS 的塊中,以便每個 I/O 請求都可以讀取整個數據文件,而無需通過網路傳輸訪問後續的 block。

參考:

https://cwiki.apache.org/confluence/display/Hive/Configuration+Properties

http://blog.cloudera.com/blog/2014/03/how-to-use-parquet-with-impala-hive-pig-maprece/

https://www.cloudera.com/documentation/enterprise/latest/topics/cdh_ig_parquet.html

https://issues.cloudera.org/browse/IMPALA-2521

https://issues.apache.org/jira/browse/HIVE-6455

http://blog.csdn.net/qq_26937525/article/details/54946281

㈢ HiveSQL核心技能之窗口計算

目標:
1、掌握 sum()、avg()等用於累計計算的聚合函數,學會對行數的限制(移動計算);
2、掌握 row_number(),rank()、dense_rank()用於排序的函數;
3、掌握 ntile()用於分組查詢的函數;
4、掌握 lag()、lead()偏移分析函數

窗口函數(window function):
與聚合函數類似,但是窗口函數是每一行數據都生成一個結果,聚合函數可以將多行數據按照規定聚合為一行,一般來說聚合後的行數要少於聚合前的行數,但是有時我們想要既顯示聚合前的數據,又要顯示聚合後的數據,這時便引入了窗口函數, 窗口函數是在 select 時執行的,位於 order by 之前

在日常工作中,經常遇到 計算截止某月或某天的累計數值 ,在Excel可以通過函數來實現,
在HiveSQL里,可以利用窗口函數實現。

1)2018年每月的支付總額和當年累計支付總額

2)對2017年和2018年公司的支付總額按月度累計進行分析,按年度進行匯總

說明:1、over中的 partition by 起到分組的作用;
2、order by 按照什麼順序進行累加,升序ASC、降序DESC,默認升序
3、正確的分組是非常重要的,partition by 後面的欄位是需要累計計算的區域,需要仔細理解

(計算三日留存、七日留存、三十日留存等方式可以使用這個函數。)

3)對2018年每個月的近三個月進行移動的求平均支付金額

用法:這三個函數的作用都是返回相應規則的排序序號,由於排序函數不是二次聚合計算,因此不一定要使用子查詢

4)2019年1月,用戶購買商品品類數量的排名

5)選出2019年支付金額排名在第10、20、30名的用戶

6)將2019年1月的支付用戶,按照支付金額分成5組

7)選出2019年退款金額排名前10%的用戶

說明:Lag和Lead分析函數可以在同一次查詢中取出同一欄位的 前N行數據(Lag)和後N行的數據(Lead) 作為獨立的列。

在實際應用當中,若要用到取今天和昨天的某欄位差值時,Lag和Lead函數的應用就顯得尤為重要。
當然,這種操作可以用表的 自連接實現 ,但是Lag和Lead與 left join、 right join等自連接相比,效率更高,SQL語句更簡潔。

8)支付時間間隔超過100天的用戶數(這一次購買距離下一次購買的時間?,注意datediff函數是日期大的在前面)

9)每個城市,不同性別,2018年支付金額最高的TOP3用戶

步驟總結:
1、首先篩選出每個用戶和每個用戶總的消費金額;
2、對兩個表進行連接提取需要的欄位;
3、對連接後的表進行二次聚合計算,計算出不同城市、性別的金額排名;
4、對二次聚合計算的表進行條件篩選提取

10)每個手機品牌退款金額前25%的用戶

步驟總結:
1、首先篩選出每個用戶和每個用戶的總退款金額;
2、對兩個表進行連接提取需要的欄位;
3、對連接後的表進行按手機品牌內分組;
4、對分組後的表進行條件篩選提取

㈣ hivesqlleftjoin左邊行數不變

不變。
Hive是基於Hadoop的一個數據倉庫工具,可以將結構化的數據文件映射為一張資料庫表,並提供簡單的sql查詢功能,可以將sql語句轉換為MapRece任務進行運行。

㈤ 數據分析課程筆記 - 19 - HiveSQL 常用優化技巧

大家好呀,這節課學習 HiveSQL 的常用優化技巧。由於 Hive 主要用來處理非常大的數據,運行過程由於通常要經過 MapRece 的過程,因此不像 MySQL 一樣很快出結果。而使用不同方法寫出來的 HiveSQL 語句執行效率也是不一樣的,因此為了減少等待的時間,提高伺服器的運行效率,我們需要在 HiveSQL 的語句上進行一些優化。

本節課的主要內容

引言
1、技巧一:列裁剪和分區裁剪
(1)列裁剪
(2)分區裁剪
2、技巧二:排序技巧——sort by代替order by
3、技巧三:去重技巧——用group by來替換distinct
4、技巧四:聚合技巧——grouping sets、cube、rollup
(1)grouping sets
(2)cube
(3)rollup
5、技巧五:換個思路解題
6、技巧六:union all時可以開啟並發執行
7、技巧七:表連接優化
8、技巧八:遵循嚴格模式

Hive 作為大數據領域常用的數據倉庫組件,在平時設計和查詢時要特別注意效率。影響Hive效率的幾乎從不是數據量過大,而是數據傾斜、數據冗餘、job 或 I/O 過多、MapRece 分配不合理等等。對 Hive 的調優既包含對HiveSQL 語句本身的優化,也包含 Hive 配置項和 MR 方面的調整。

列裁剪就是在查詢時只讀取需要的列。當列很多或者數據量很大時,如果select 所有的列或者不指定分區,導致的全表掃描和全分區掃描效率都很低。Hive中與列裁剪優化相關的配置項是 hive.optimize.cp ,默認是 true 。

分區裁剪就是在查詢時只讀需要的分區。Hive中與分區裁剪優化相關的則是 hive.optimize.pruner ,默認是 true 。

HiveSQL中的 order by 與其他 SQL 語言中的功能一樣,就是將結果按某個欄位全局排序,這會導致所有map端數據都進入一個 rece 中,在數據量大時可能會長時間計算不完。

如果使用 sort by ,那麼就會視情況啟動多個 recer 進行排序,並且保證每個 recer 內局部有序。為了控制 map 端數據分配到 rece 的 key,往往還要配合 distribute by 一同使用。如果不加 distribute by 的話,map 端數據就會隨機分配給 recer。

這里需要解釋一下, distribute by 和 sort by 結合使用是如何相較於 order by 提升運行效率的。

假如我們要對一張很大的用戶信息表按照年齡進行分組,優化前的寫法是直接 order by age 。使用 distribute by 和 sort by 結合進行優化的時候, sort by 後面還是 age 這個排序欄位, distribute by 後面選擇一個沒有重復值的均勻欄位,比如 user_id 。

這樣做的原因是,通常用戶的年齡分布是不均勻的,比如20歲以下和50歲以上的人非常少,中間幾個年齡段的人又非常多,在 Map 階段就會造成有些任務很大,有些任務很小。那通過 distribute by 一個均勻欄位,就可以讓系統均勻地進行「分桶」,對每個桶進行排序,最後再組合,這樣就能從整體上提升 MapRece 的效率。

取出 user_trade 表中全部支付用戶:

原有寫法的執行時長:

優化寫法的執行時長:

考慮對之前的案例進行優化:

注意: 在極大的數據量(且很多重復值)時,可以先 group by 去重,再 count() 計數,效率高於直接 count(distinct **) 。

如果我們想知道用戶的性別分布、城市分布、等級分布,你會怎麼寫?

通常寫法:

缺點 :要分別寫三次SQL,需要執行三次,重復工作,且費時。

那該怎麼優化呢?

注意 :這個聚合結果相當於縱向地堆在一起了(Union all),分類欄位用不同列來進行區分,也就是每一行數據都包含 4 列,前三列是分類欄位,最後一列是聚合計算的結果。

GROUPING SETS() :在 group by 查詢中,根據不同的維度組合進行聚合,等價於將不同維度的 group by 結果集進行 union all。聚合規則在括弧中進行指定。

如果我們想知道用戶的性別分布以及每個性別的城市分布,你會怎麼寫?

那該怎麼優化呢?

注意: 第二列為NULL的,就是性別的用戶分布,其餘有城市的均為每個性別的城市分布。

cube:根據 group by 維度的所有組合進行聚合

注意 :跑完數據後,整理很關鍵!!!

rollup:以最左側的維度為主,進行層級聚合,是cube的子集。

如果我想同時計算出,每個月的支付金額,以及每年的總支付金額,該怎麼辦?

那應該如何優化呢?

條條大路通羅馬,寫SQL亦是如此,能達到同樣效果的SQL有很多種,要學會思路轉換,靈活應用。

來看一個我們之前做過的案例:

有沒有別的寫法呢?

Hive 中互相沒有依賴關系的 job 間是可以並行執行的,最典型的就是
多個子查詢union all。在集群資源相對充足的情況下,可以開啟並
行執行。參數設置: set hive.exec.parallel=true;

時間對比:

所謂嚴格模式,就是強制不允許用戶執行3種有風險的 HiveSQL 語句,一旦執行會直接報錯。

要開啟嚴格模式,需要將參數 hive.mapred.mode 設為 strict 。

好啦,這節課的內容就是這些。以上優化技巧需要大家在平時的練習和使用中有意識地去注意自己的語句,不斷改進,就能掌握最優的寫法。

㈥ 程序中的Hive具體是干什麼用的呢

Hive是基於Hadoop平台的數倉工具,具有海量數據存儲、水平可擴展、離線批量處理的優點,解決了傳統關系型數倉不能支持海量數據存儲、水平可擴展性差等問題,但是由於Hive數據存儲和數據處理是依賴於HDFS和MapRece,因此在Hive進行數據離線批量處理時,需將查詢語言先轉換成MR任務,由MR批量處理返回結果,所以Hive沒法滿足數據實時查詢分析的需求。
Hive是由FaceBook研發並開源,當時FaceBook使用Oracle作為數倉,由於數據量越來越大,Oracle數倉性能越來越差,沒法實現海量數據的離線批量分析,因此基於Hadoop研發Hive,並開源給Apacha。
由於Hive不能實現數據實時查詢交互,Hbase可提供實時在線查詢能力,因此Hive和Hbase形成了良性互補。Hbase因為其海量數據存儲、水平擴展、批量數據處理等優點,也得到了廣泛應用。
Pig與HIVE工具類似,都可以用類sql語言對數據進行處理。但是他們應用場景有區別,Pig用於數據倉庫數據的ETL,HIVE用於數倉數據分析。
從架構圖當中,可看出Hive並沒有完成數據的存儲和處理,它是由HDFS完成數據存儲,MR完成數據處理,其只是提供了用戶查詢語言的能力。Hive支持類sql語言,這種SQL稱為Hivesql。用戶可用Hivesql語言查詢,其驅動可將Hivesql語言轉換成MR任務,完成數據處理。
【Hive的訪問介面】
CLI:是hive提供的命令行工具
HWI:是Hive的web訪問介面
JDBC/ODBC:是兩種的標準的應用程序編程訪問介面
Thrift Server:提供異構語言,進行遠程RPC調用Hive的能力。
因此Hiv具備豐富的訪問介面能力,幾乎能滿足各種開發應用場景需求。
【Driver】
是HIVE比較核心的驅動模塊,包含編譯器、優化器、執行器,職責為把用戶輸入的Hivesql轉換成MR數據處理任務
【Metastore】
是HIVE的元數據存儲模塊,數據的訪問和查找,必須要先訪問元數據。Hive中的元數據一般使用單獨的關系型資料庫存儲,常用的是Mysql,為了確保高可用,Mysql元資料庫還需主備部署。
架構圖上面Karmasphere、Hue、Qubole也是訪問HIVE的工具,其中Qubole可遠程訪問HIVE,相當於HIVE作為一種公有雲服務,用戶可通過互聯網訪問Hive服務。
Hive在使用過程中出現了一些不穩定問題,由此發展出了Hive HA機制,

㈦ 數據分析會用到哪些工具


1、數據處理工具:Excel


數據分析師,在有些公司也會有數據產品經理、數據挖掘工程師等等。他們最初級最主要的工具就是Excel。有些公司也會涉及到像Visio,Xmind、PPT等設計圖標數據分析方面的高級技巧。數據分析師是一個需要擁有較強綜合能力的崗位,因此,在有些互聯網公司仍然需要數據透視表演練、Vision跨職能流程圖演練、Xmind項目計劃導圖演練、PPT高級動畫技巧等。


2、資料庫:MySQL


Excel如果能夠玩的很轉,能勝任一部分數據量不是很大的公司。但是基於Excel處理數據能力有限,如果想勝任中型的互聯網公司中數據分析崗位還是比較困難。因此需要學會資料庫技術,一般Mysql。你需要了解MySQL管理工具的使用以及資料庫的基本操作;數據表的基本操作、MySQL的數據類型和運算符、MySQL函數、查詢語句、存儲過程與函數、觸發程序以及視圖等。比較高階的需要學習MySQL的備份和恢復;熟悉完整的MySQL數據系統開發流程。


3、數據可視化:Tableau & Echarts


如果說前面2條是數據處理的技術,那麼在如今“顏值為王”的現在,如何將數據展現得更好看,讓別人更願意看,這也是一個技術活。好比公司領導讓你對某一個項目得研究成果做匯報,那麼你不可能給他看單純的數據一樣,你需要讓數據更直觀,甚至更美觀。


Echarts是開源的,代碼可以自己改,種類也非常豐富,這里不多做介紹,可以去創建一個工作區了解下。


4、大數據分析:SPSS & Python& HiveSQL 等


如果說Excel是“輕數據處理工具”,Mysql是“中型數據處理工具”那麼,大數據分析,涉及的面就非常廣泛,技術點涉及的也比較多。這也就是為什麼目前互聯網公司年薪百萬重金難求大數據分析師的原因。

㈧ Hive sql及窗口函數

hive函數:

1、根據指定條件返回結果:case when then else end as

2、基本類型轉換:CAST()

3、nvl:處理空欄位:三個str時,是否為空可以指定返回不同的值

4、sql通配符: https://www.w3school.com.cn/sql/sql_wildcards.asp

5、count(1)與COUNT(*):返回行數

如果表沒有主鍵,那麼count(1)比count(*)快;

如果有主鍵,那麼count(主鍵,聯合主鍵)比count(*)快;

count(1)跟count(主鍵)一樣,只掃描主鍵。count(*)跟count(非主鍵)一樣,掃描整個表。明顯前者更快一些。

性能問題:

1.任何情況下SELECT COUNT(*) FROM tablename是最優選擇,(指沒有where的情況);

2.盡量減少SELECT COUNT(*) FROM tablename WHERE COL = 『value』 這種查詢;

3.杜絕SELECT COUNT(COL) FROM tablename WHERE COL2 = 『value』 的出現。

count(expression):查詢 is_reply=0 的數量: SELECT COUNT(IF(is_reply=0,1,NULL)) count FROM t_iov_help_feedback;

6、distinct與group by

distinct去重所有distinct之後所有的欄位,如果有一個欄位值不一致就不作為一條

group by是根據某一欄位分組,然後查詢出該條數據的所需欄位,可以搭配 where max(time)或者Row_Number函數使用,求出最大的一條數據

7、使用with 臨時表名 as() 的形式,簡單的臨時表直接嵌套進sql中,復雜的和需要復用的表寫到臨時表中,關聯的時候先找到關聯欄位,過濾條件最好在臨時表中先過濾後關聯

處理json的函數:

split(json_array_string(schools), '\\|\\|') AS schools

get_json_object(school, '$.id') AS school_id,

字元串函數:

1、instr(』源字元串』 , 『目標字元串』 ,』開始位置』,』第幾次出現』)

instr(sourceString,destString,start,appearPosition)

1.sourceString代表源字元串; destString代表要從源字元串中查找的子串;

2.start代表查找的開始位置,這個參數可選的,默認為1;

3.appearPosition代表想從源字元中查找出第幾次出現的destString,這個參數也是可選的, 默認為1

4.如果start的值為負數,則代表從右往左進行查找,但是位置數據仍然從左向右計算。

5.返回值為:查找到的字元串的位置。如果沒有查找到,返回0。

最簡單例子: 在abcd中查找a的位置,從第一個字母開始查,查找第一次出現時的位置

select instr(『abcd』,』a』,1,1) from al; —1

應用於模糊查詢:instr(欄位名/列名, 『查找欄位』)

select code,name,dept,occupation from staff where instr(code, 『001』)> 0;

等同於 select code, name, dept, occupation from staff where code like 『%001%』 ;

應用於判斷包含關系:

select ccn,mas_loc from mas_loc where instr(『FH,FHH,FHM』,ccn)>0;

等同於 select ccn,mas_loc from mas_loc where ccn in (『FH』,』FHH』,』FHM』);

2、substr(string A,int start,int len)和 substring(string A,int start,int len),用法一樣

substr(time,1,8) 表示將time從第1位開始截取,截取的長度為8位

第一種用法:

substr(string A,int start)和 substring(string A,int start),用法一樣

功效:返回字元串A從下標start位置到結尾的字元串

第二種用法:

substr(string A,int start,int len)和 substring(string A,int start,int len),用法一樣

功效:返回字元串A從下標start位置開始,長度為len的字元串

3、get_json_object(form_data,'$.學生姓名') as student_name

json_tuple 函數的作用:用來解析json字元串中的多個欄位

4、split(full_name, '\\.') [5] AS zq;  取的是數組里的第六個

日期(時間)函數:

1、to_date(event_time) 返回日期部分

2、date_sub:返回當前日期的相對時間

當前日期:select curdate() 

當前日期前一天:select  date_sub(curdate(),interval 1 day)

當前日期後一天:select date_sub(curdate(),interval -1 day)

date_sub(from_unixtime(unix_timestamp(), 'yyyy-MM-dd HH:mm:ss'), 14)  將現在的時間總秒數轉為標准格式時間,返回14天之前的時間

時間戳>>>>日期:

from_unixtime(unix_timestamp(), 'yyyy-MM-dd HH:mm:ss') 將現在的時間總秒數轉為標准格式時間

from_unixtime(get_json_object(get_json_object(form_data,'$.挽單時間'),'$.$date')/1000) as retain_time

unix_timestamp('2019-08-15 16:40:00','yyyy-MM-dd HH:mm:ss')  --1565858400

日期>>>>時間戳:unix_timestamp()

date_format:yyyy-MM-dd HH:mm:ss 時間轉格式化時間

select date_format('2019-10-07 13:24:20', 'yyyyMMdd000000')-- 20191007000000select date_format('2019-10-07', 'yyyyMMdd000000')-- 20191007000000

1.日期比較函數: datediff語法: datediff(string enddate,string startdate) 

返回值: int 

說明: 返回結束日期減去開始日期的天數。 

舉例:  hive> select datediff('2016-12-30','2016-12-29');  1

2.日期增加函數: date_add語法: date_add(string startdate, intdays) 

返回值: string 

說明: 返回開始日期startdate增加days天後的日期。 

舉例:  hive>select date_add('2016-12-29',10);  2017-01-08

3.日期減少函數: date_sub語法: date_sub (string startdate,int days) 

返回值: string 

說明: 返回開始日期startdate減少days天後的日期。 

舉例:  hive>select date_sub('2016-12-29',10);  2016-12-19

4.查詢近30天的數據

select * from table where datediff(current_timestamp,create_time)<=30;

create_time 為table里的欄位,current_timestamp 返回當前時間 2018-06-01 11:00:00

3、trunc()函數的用法:當前日期的各種第一天,或者對數字進行不四捨五入的截取

日期:

1.select trunc(sysdate) from al  --2011-3-18  今天的日期為2011-3-18

2.select trunc(sysdate, 'mm')   from   al  --2011-3-1    返回當月第一天.

上月1號    trunc(add_months(current_date(),-1),'MM')

3.select trunc(sysdate,'yy') from al  --2011-1-1       返回當年第一天

4.select trunc(sysdate,'dd') from al  --2011-3-18    返回當前年月日

5.select trunc(sysdate,'yyyy') from al  --2011-1-1   返回當年第一天

6.select trunc(sysdate,'d') from al  --2011-3-13 (星期天)返回當前星期的第一天

7.select trunc(sysdate, 'hh') from al   --2011-3-18 14:00:00   當前時間為14:41  

8.select trunc(sysdate, 'mi') from al  --2011-3-18 14:41:00   TRUNC()函數沒有秒的精確

數字:TRUNC(number,num_digits) Number 需要截尾取整的數字。Num_digits 的默認值為 0。TRUNC()函數截取時不進行四捨五入

11.select trunc(123.458,1) from al --123.4

12.select trunc(123.458,-1) from al --120

4、round():四捨五入:

select round(1.455, 2)  #結果是:1.46,即四捨五入到十分位,也就是保留兩位小數

select round(1.5)  #默認四捨五入到個位,結果是:2

select round(255, -1)  #結果是:260,即四捨五入到十位,此時個位是5會進位

floor():地板數

ceil()天花板數

5、

6.日期轉年函數: year語法:   year(string date) 

返回值: int

說明: 返回日期中的年。

舉例:

hive>   select year('2011-12-08 10:03:01') from al;

2011

hive>   select year('2012-12-08') fromal;

2012

7.日期轉月函數: month語法: month   (string date) 

返回值: int

說明: 返回日期中的月份。

舉例:

hive>   select month('2011-12-08 10:03:01') from al;

12

hive>   select month('2011-08-08') fromal;

8

8.日期轉天函數: day語法: day   (string date) 

返回值: int

說明: 返回日期中的天。

舉例:

hive>   select day('2011-12-08 10:03:01') from al;

8

hive>   select day('2011-12-24') fromal;

24

9.日期轉小時函數: hour語法: hour   (string date) 

返回值: int

說明: 返回日期中的小時。

舉例:

hive>   select hour('2011-12-08 10:03:01') from al;

10

10.日期轉分鍾函數: minute語法: minute   (string date) 

返回值: int

說明: 返回日期中的分鍾。

舉例:

hive>   select minute('2011-12-08 10:03:01') from al;

3

11.日期轉秒函數: second語法: second   (string date) 

返回值: int

說明: 返回日期中的秒。

舉例:

hive>   select second('2011-12-08 10:03:01') from al;

1

12.日期轉周函數: weekofyear語法:   weekofyear (string date) 

返回值: int

說明: 返回日期在當前的周數。

舉例:

hive>   select weekofyear('2011-12-08 10:03:01') from al;

49

查看hive表在hdfs中的位置:show create table 表名;

在hive中hive2hive,hive2hdfs:

HDFS、本地、hive -----> Hive:使用 insert into | overwrite、loaddata local inpath "" into table student;

Hive ----> Hdfs、本地:使用:insert overwrite | local

網站訪問量統計:

uv:每用戶訪問次數

ip:每ip(可能很多人)訪問次數

PV:是指頁面的瀏覽次數

VV:是指你訪問網站的次數

sql:

基本函數:

count、max、min、sum、avg、like、rlike('2%'、'_2%'、%2%'、'[2]')(java正則)

and、or、not、in   

where、group by、having、{ join on 、full join}  、order by(desc降序)

sort by需要與distribut by集合結合使用:

hive (default)> set maprece.job.reces=3;  //先設置rece的數量 

insert overwrite local directory '/opt/mole/datas/distribute-by'

row format delimited fields terminated by '\t'

先按照部門編號分區,再按照員工編號降序排序。

select * from emp distribute by deptno sort by empno desc;

外部表  create external table if not exists dept

分區表:create table dept_partition ( deptno int, dname string, loc string )  partitioned by ( month string )

load data local inpath '/opt/mole/datas/dept.txt' into table default.dept_partition partition(month='201809'); 

 alter table dept_partition add/drop partition(month='201805') ,partition(month='201804');

多分區聯合查詢:union

select * from dept_partition2 where month='201809' and day='10';

show partitions dept_partition;

desc formatted dept_partition;

二級分區表:create table dept_partition2 ( deptno int, dname string, loc string ) partitioned by (month string, day string) row format delimited fields terminated by '\t';

分桶抽樣查詢:分區針對的是數據的存儲路徑;分桶針對的是數據文件

create table stu_buck(id int, name string) clustered by(id) into 4 bucketsrow format delimited fields terminated by '\t';

設置開啟分桶與rece為1:

set hive.enforce.bucketing=true;

set maprece.job.reces=-1;

分桶抽樣:select * from stu_bucktablesample(bucket x out of y on id);

抽取,桶數/y,x是從哪個桶開始抽取,y越大 抽樣數越少,y與抽樣數成反比,x必須小於y

給空欄位賦值:

如果員工的comm為NULL,則用-1代替或用其他欄位代替  :select nvl(comm,-1) from emp;

case when:如何符合記為1,用於統計、分組統計

select dept_id, sum(case sex when '男' then 1 else 0 end) man , sum(case sex when '女' then 1 else 0 end) woman from emp_sex group by dept_id;

用於組合歸類匯總(行轉列):UDAF:多轉一

concat:拼接查詢結果

collect_set(col):去重匯總,產生array類型欄位,類似於distinct

select t.base, concat_ws('|',collect_set(t.name))   from (select concat_ws(',',xingzuo,blood_type) base,name  from person_info) t group by t.base;

解釋:先第一次查詢得到一張沒有按照(星座血型)分組的表,然後分組,使用collect_set將名字組合成數組,然後使用concat將數組變成字元串

用於拆分數據:(列轉行):UDTF:一轉多

explode(col):將hive一列中復雜的array或者map結構拆分成多行。

lateral view  側面顯示:用於和UDTF一對多函數搭配使用

用法:lateral view udtf(expression) tablealias as cate

cate:炸開之後的列別名

temptable :臨時表表名

解釋:用於和split, explode等UDTF一起使用,它能夠將一列數據拆成多行數據,在此基礎上可以對拆分後的數據進行聚合。

開窗函數:

Row_Number,Rank,Dense_Rank  over:針對統計查詢使用

Row_Number:返回從1開始的序列

Rank:生成分組中的排名序號,會在名詞s中留下空位。3 3 5

dense_rank:生成分組中的排名序號,不會在名詞中留下空位。3 3 4

over:主要是分組排序,搭配窗口函數使用

結果:

SUM、AVG、MIN、MAX、count

preceding:往前

following:往後

current row:當前行

unbounded:unbounded preceding 從前面的起點, unbounded following:到後面的終點

sum:直接使用sum是總的求和,結合over使用可統計至每一行的結果、總的結果、當前行+之前多少行/之後多少行、當前行到往後所有行的求和。

over(rowsbetween 3/current )  當前行到往後所有行的求和

ntile:分片,結合over使用,可以給數據分片,返回分片號

使用場景:統計出排名前百分之或n分之一的數據。

lead,lag,FIRST_VALUE,LAST_VALUE

lag與lead函數可以返回上下行的數據

lead(col,n,dafault) 用於統計窗口內往下第n行值

第一個參數為列名,第二個參數為往下第n行(可選,默認為1),第三個參數為默認值(當往下第n行為NULL時候,取默認值,如不指定,則為NULL)

LAG(col,n,DEFAULT) 用於統計窗口內往上第n行值

第一個參數為列名,第二個參數為往上第n行(可選,默認為1),第三個參數為默認值(當往上第n行為NULL時候,取默認值,如不指定,則為NULL)

使用場景:通常用於統計某用戶在某個網頁上的停留時間

FIRST_VALUE:取分組內排序後,截止到當前行,第一個值

LAST_VALUE:取分組內排序後,截止到當前行,最後一個值

范圍內求和: https://blog.csdn.net/happyrocking/article/details/105369558

cume_dist,percent_rank

–CUME_DIST :小於等於當前值的 行數 / 分組內總行數

–比如,統計小於等於當前薪水的人數,占總人數的比例

percent_rank:分組內當前行的RANK值-1/分組內總行數-1

總結:

在Spark中使用spark sql與hql一致,也可以直接使用sparkAPI實現。

HiveSql窗口函數主要應用於求TopN,分組排序TopN、TopN求和,前多少名前百分之幾。

與Flink窗口函數不同。

Flink中的窗口是用於將無線數據流切分為有限塊處理的手段。

window分類:

CountWindow:按照指定的數據條數生成一個 Window,與時間無關。

TimeWindow:按照時間生成 Window。

1. 滾動窗口(Tumbling Windows):時間對齊,窗口長度固定,不重疊::常用於時間段內的聚合計算

2.滑動窗口(Sliding Windows):時間對齊,窗口長度固定,可以有重疊::適用於一段時間內的統計(某介面最近 5min 的失敗率來報警)

3. 會話窗口(Session Windows)無時間對齊,無長度,不重疊::設置session間隔,超過時間間隔則窗口關閉。

㈨ 數據分析工具軟體有哪些



數據分析工具靠不靠譜,來試試Smartbi

Excel也存在一些問題,長期困擾一線業務用戶:

1.首先是性能問題。對於大數據量,Excel處理起來很慢,甚至超過100萬行,就完全不支持。

2.數據獲取的過程麻煩。特別是周期性的數據獲取,每次都要找IT人員幫忙,再粘貼到excel中去。

3.共享的安全性和便利性問題。用戶大都是把Excel文件通過郵件或即時通訊軟體共享。首先,文件滿天飛,不好管理;其次,許可權不好控制,沒法做到只共享分析結果,而不共享明細數據;最後,數據沒法做到每個人的數據不同,根據用戶許可權動態更新數據。

Smartbi Excel分析就是面向Excel用戶的數據分析工具,它結合了Excel的優點,解決了Excel的問題,真正做到賦能企業一線業務用戶,讓人人都是自助分析師,促進企業的全民數字化運營。


Smartbi Excel分析的功能亮點

1.支持Excel直連資料庫,數據准備自己搞定

2.支持使用Excel計算公式對線上線下數據做聯合分析

3.支持使用Excel圖形、數據透視表來分析和展現數據

4.支持模板和數據分離,重用分析模板,動態更新數據

5.支持對Excel中的數據進行二次加工,告別依賴於IT人員處理的困境

6.支持超大數據量處理,支持在個人Excel端運算,也支持在伺服器(集群)運算

7.支持全面的許可權管控,提供細粒度的許可權控制,精確控制每一個用戶的數據許可權

思邁特軟體Smartbi經過多年持續自主研發,凝聚大量商業智能最佳實踐經驗,整合了各行業的數據分析和決策支持的功能需求。滿足最終用戶在企業級報表、數據可視化分析、自助探索分析、數據挖掘建模、AI智能分析等大數據分析需求。

思邁特軟體Smartbi個人用戶全功能模塊長期免費試用
馬上免費體驗:Smartbi一站式大數據分析平台

㈩ HiveSQL核心技能之表連接

目標:
1、掌握HQL中的各種連接及其組合使用;
2、掌握數據分析中業務指標思路轉換的技巧;
3、區分好full join 和 union all 的使用場景;
4、在多表連接時,注意各種細節和業務邏輯;
5、復雜表連接要學會分步驟處理

需注意:
1、表連接時,必須進行重命名;
2、on後面使用的連接條件必須起到 唯一鍵值 的作用(有時會有多個欄位組合);
3、inner可省略不寫,效果是一樣的
4、表連接時不能使用 a join b join c這種方式,不然會極度浪費電腦的資源和延長查詢時間,要在子查詢的表裡先做好篩選之後在連接;

1)找出在2019年購買後又退款的用戶(記得要去重)

注意:一定要先去重,再做表連接,養成良好的習慣(雖然可以先連接再去重,但是那麼做會使執行效率很低)

2)在2017年和2018年都購買的用戶

3)在2017年、2018年、2019年都有交易的用戶

進行左連接之後,以左表為全集,返回能夠匹配上的右邊表的匹配結果,沒有匹配上的則顯示NULL。

拓展:
right join:以右表為全集,返回能夠匹配上的左邊表的匹配結果,沒有匹配上的則顯示NULL,可以由left join改寫出同樣的結果。

4)在2019年購買,但是沒有退款的用戶

5)在2019年由購買的用戶的學歷分布

6)在2017年和2018年都購買,但是沒有在2019年購買的用戶

查詢兩個表的所有用戶時使用full join是一個比較好的方法(需要用到coalesce函數:

註:coalesce函數,coalesce(expression1,expression2,...,expression n),依次參考各參數表達式,遇到非null值即停止並返回該值,如果所有的表達式都是空值,最終將返回一個空值。

註:表合並時欄位名稱必須一致,欄位順序必須一致,而且不用填寫連接條件

7)2017-2019年由交易的所有用戶數

union all 和 union 的區別:
union all 不會去重,不會排序,效率較快;union 會去重且排序,效率較慢。
如果表很大時,推薦先去重,再進行 union all ,不能直接對表進行 union all,不然效率很慢。

8)2019年每個用戶的支付和退款金額匯總

也可以使用 full join 的方式:

9)2019年每個支付用戶的支付金額和退款金額

10)首次激活時間在2017年,但是一直沒有支付的用戶年齡段分布

步驟總結:
1、先篩選出年份為2017注冊的用戶;
2、沒有支付的人;
3、年齡段分布
注意:由於age也是在user_info的表格里,第三步用的欄位需要在第一步進行預處理,所以在限制時間的時候需要同時對年齡段進行預處理,這樣在第三步的時候才會由年齡段這個欄位;需要注意對 case when 的欄位進行重命名才能進行後續的操作

11)2018、2019年交易的用戶,其激活時間段分布

步驟總結:
1. 取出2018和2019年所有的交易用戶的交集
2. 取出所有用戶的激活時間
3. 統計時間分布