大資料技術 - 為什麼是SQL

渡碼發表於2019-05-14

在大資料處理以及分析中 SQL 的普及率非常高,幾乎是每一個大資料工程師必須掌握的語言,甚至非資料處理崗位的人也在學習使用 SQL。今天這篇文章就聊聊 SQL 在資料分析中作用以及掌握 SQL 的必要性

SQL解決了什麼問題

SQL的中文翻譯為:結構化查詢語言。這裡面有三層含義:首先這是一門程式語言;其次,這是一門查詢語言;最後,這是在結構化資料上做查詢的語言。結構化資料就是資料庫裡的二維表,不瞭解資料庫的讀者可以把它看做 Excel 裡面的表格。雖然 SQL可以解決查詢問題,但是 SQL 並不僅僅只提供查詢的功能,它還可以對錶進行增加、更新、刪除等操作。

SQL 的主要應用場景有兩個:

第一,傳統資料庫的增刪改查。以查詢舉例,App 的某個頁面展示的資料一般存放在傳統資料庫中,通過 SQL 可以讀取資料庫中的內容用於展示。

第二,大資料統計分析。比如,統計 App 的日活,這時候 SQL 的作用是查詢和計算。大資料場景幾乎不會對錶中的記錄更新和刪除。

SQL的優勢

語法簡單

SQL 的語法相對於其他程式語言非常簡單,常用的關鍵字也就幾個,selectfromwherejoinif 等。沒有像 Java、C++ 等程式語言定義的類、物件、繼承之類的複雜概念。

表達能力強

完成同樣的統計功能,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 並不是程式設計師專有技能。那麼目前市場環境中有哪些職位應該掌握 SQL。

  • 大資料 / BI 工程師:可以說是資料直接提供方,將採集的資料進行合理的組織,建立二維表儲存資料,設計資料倉儲模型,以便分析團隊能夠便捷地、快速地獲取到想要的資料。
  • 機器學習及資料探勘工程師:做挖掘的資料很可能來自資料倉儲,使用 SQL 統計可以非常方便地瞭解資料、分析資料,與資料團隊之間溝通成本更低。
  • 資料分析師:有不少非程式設計師出身,但是為了跟大資料團隊配合也需要使用 SQL 並且需要懂一些大資料處理方便的專業知識。我接觸過不少資料分析師,他們的 SQL 水平參差不齊, 有的根本不寫 SQL,主要用 R 、Python 或 Excel 進行分析。而有些人能夠熟練掌握 SQL 並且也瞭解一大資料處理技術,這樣跟資料團隊配合的會更好。
  • 產品經理和運營:產品和運營會經常進行資料分析,他們分析的資料最常見的來源是 BI 團隊提供的報表,但這種方式非常不靈活。因此對於產品和運營如果能掌握 SQL 自助地分析會大大提升分析效率。我有個朋友在美團做產品經理,他們會使用 SQL 並且能夠為 BI 團隊擋下大部分無用的資料需求。當然現在一些 BI 團隊也會提供各種視覺化工具來滿足業務方的資料需求,這只是一個折中的方案。建議與資料分析相關崗位的同學都掌握 SQL ,學習 SQL 並不比熟練 Excel 操作更復雜。

大資料中的 SQL

目前比較火的大資料框架比如 MapReduce(Hive)、Spark、Flink 都支援 SQL。在大資料中 SQL 應用主要分兩種:一種是週期性的統計任務,另一種是分析任務。前者對實時性要求不高,一般用 Hive 或者 Spark 批處理任務去完成。對於後者偏重分析,需要快速的洞察資料得出結論,這種任務可以使用 Hive 來完成,如果需要更高的實時性,互動性要求可以使用 Kylin 等多維分析框架。

以上便是大資料處理和分析中 SQL 扮演的角色以及地位。SQL 應用是建立在資料庫之上,對於大資料目前應用比較廣泛的是 Hive, 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 的語法以及背後的大資料資料技術。

如有疑問請掃描右上方二維碼直接與我交流

 

相關文章