在大數據處理以及分析中 SQL 的普及率很是高,幾乎是每個大數據工程師必須掌握的語言,甚至非數據處理崗位的人也在學習使用 SQL。今天這篇文章就聊聊 SQL 在數據分析中做用以及掌握 SQL 的必要性。html
SQL的中文翻譯爲:結構化查詢語言。這裏面有三層含義:首先這是一門編程語言;其次,這是一門查詢語言;最後,這是在結構化數據上作查詢的語言。結構化數據就是數據庫裏的二維表,不瞭解數據庫的讀者能夠把它看作 Excel 裏面的表格。雖然 SQL能夠解決查詢問題,可是 SQL 並不只僅只提供查詢的功能,它還能夠對錶進行增長、更新、刪除等操做。java
SQL 的主要應用場景有兩個:mysql
第一,傳統數據庫的增刪改查。以查詢舉例,App 的某個頁面展現的數據通常存放在傳統數據庫中,經過 SQL 能夠讀取數據庫中的內容用於展現。程序員
第二,大數據統計分析。好比,統計 App 的日活,這時候 SQL 的做用是查詢和計算。大數據場景幾乎不會對錶中的記錄更新和刪除。
sql
語法簡單數據庫
SQL 的語法相對於其餘編程語言很是簡單,經常使用的關鍵字也就幾個,select、from、where、join、if 等。沒有像 Java、C++ 等編程語言定義的類、對象、繼承之類的複雜概念。apache
完成一樣的統計功能,SQL 代碼量較少。舉一個大數據統計經常使用的例子 WordCount,以前我寫的使用 MapReduce 寫的代碼大概 40 行。下面咱們用 SQL 寫一下看看多麼簡單,你會發現so easy,若是看不懂能夠暫時忽略,後續有講解。編程
select word, count(1) from ( select * from tb lateral view explode(split(words, ' ')) words_tb as word ) tmp group by word ;
經過如上能夠看到只用了 5 行代碼就完成了 WordCount,SQL 的表達力強,能夠大大減小代碼量。框架
咱們很容易將 SQL 代碼映射到二維表中的數據,好比上面例子中的代碼,第一個括號裏面的 select ... from 表明拿到了 tb 這個表的數據並作轉換;第二個 select ... from 至關於基於第一個括號裏生成的數據再進行操做。因此 SQL 不一樣操做的代碼其實就是對應着二維表的不斷變換,相對容易理解。機器學習
我以爲將來只要跟數據相關的從業者都應該掌握 SQL,在編程愈來愈普及的背景下,SQL 並非程序員專有技能。那麼目前市場環境中有哪些職位應該掌握 SQL。
目前比較火的大數據框架好比 MapReduce(Hive)、Spark、Flink 都支持 SQL。在大數據中 SQL 應用主要分兩種:一種是週期性的統計任務,另外一種是分析任務。前者對實時性要求不高,通常用 Hive 或者 Spark 批處理任務去完成。對於後者偏重分析,須要快速的洞察數據得出結論,這種任務可使用 Hive 來完成,若是須要更高的實時性,交互性要求可使用 Kylin 等多維分析框架。
以上即是大數據處理和分析中 SQL 扮演的角色以及地位。SQL 應用是創建在數據庫之上,對於大數據目前應用比較普遍的是 Hive, Hive 的安裝簡述以下。
安裝 Hive 須要基於 Hadoop,Hadoop 的安裝在「大數據技術 - 學習之路(一)」中已經介紹過,本次 Hive 的安裝也是基於以前的環境進行。Hadoop 2.x.y 版本對應 Hive 也是 2.x.y 版本,咱們能夠下載 apache-hive-2.3.4-bin.tar.gz 文件進行安裝。Hive 的安裝相對簡單,能夠對照官網進行,主要步驟以下:
解壓apache-hive-2.3.4-bin.tar.gz
tar -zxvf apache-hive-2.3.4-bin.tar.gz mv apache-hive-2.3.4-bin hive-2.3.4
配置 HIVE_HOME 環境變量
vi /etc/profile #增長並修改如下內容 HIVE_HOME=/work/software/hive-2.3.4 export PATH=$JAVA_HOME/bin:$HADOOP_HOME/bin:$HIVE_HOME/bin:$PATH source /etc/profile
在 HDFS 建立Hive數據庫的路徑(修改數據庫默認路徑: hive.metastore.warehouse.dir)
hadoop fs -mkdir /tmp hadoop fs -mkdir /user/hive/warehouse hadoop fs -chmod g+w /tmp hadoop fs -chmod g+w /user/hive/warehouse
初始化 meta 數據庫
# Hive 將表的元數據信息(表名、列名及數據類型等)存儲在關係型數據庫中,目前支持 mysql 和 derby,本身學習使用能夠用 derby,生產環境建議用 mysql schematool -dbType derby -initSchema
# 執行成功後會看到在 hive-2.3.4 目錄下有個 metastore_db 目錄,存放元數據信息
若是不進行該操做可能會報如下錯誤
FAILED: SemanticException org.apache.hadoop.hive.ql.metadata.HiveException: java.lang.RuntimeException: Unable to instantiate org.apache.hadoop.hive.ql.metadata.SessionHiveMetaStoreClient
啓動 Hive 客戶端,直接運行 hive 命令便可
[root@hadoop0 hadoop-2.9.2]# hive which: no hbase in (/work/software/jdk1.8.0_151/bin:/work/software/hadoop-2.9.2/bin:/work/software/hive-2.3.4/bin:/work/software/jdk1.8.0_151/bin:/work/software/hadoop-2.9.2/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin) SLF4J: Class path contains multiple SLF4J bindings. SLF4J: Found binding in [jar:file:/work/software/hive-2.3.4/lib/log4j-slf4j-impl-2.6.2.jar!/org/slf4j/impl/StaticLoggerBinder.class] SLF4J: Found binding in [jar:file:/work/software/hadoop-2.9.2/share/hadoop/common/lib/slf4j-log4j12-1.7.25.jar!/org/slf4j/impl/StaticLoggerBinder.class] SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation. SLF4J: Actual binding is of type [org.apache.logging.slf4j.Log4jLoggerFactory] Logging initialized using configuration in jar:file:/work/software/hive-2.3.4/lib/hive-common-2.3.4.jar!/hive-log4j2.properties Async: true Hive-on-MR is deprecated in Hive 2 and may not be available in the future versions. Consider using a different execution engine (i.e. spark, tez) or using Hive 1.X releases. hive>
因爲元數據目錄在 hive-2.3.4 目錄下的 metastore_db 目錄,所以後續啓動 hive 客戶端都要在 hive-2.3.4 目錄下
驗證 hive
hive> show databases; OK default Time taken: 9.366 seconds, Fetched: 1 row(s)
說明咱們能夠正常使用 hive 了
這篇文章主要介紹了數據統計與分析過程當中 SQL 所扮演的角色,以及在目前大數據技術支持 SQL 的數據框架,最後簡單介紹了 Hive 的安裝。後續咱們會繼續介紹 SQL 的語法以及背後的大數據數據技術。
若有疑問請掃描右上方二維碼直接與我交流