Hadoop生態圈(六):Hive(一)

目錄

1 Hive基本概念

1.1 什麼是hive

1.2 hive的特點

1.2.1 優點

1.2.2 缺點

1.3 Hive架構原理

1.4 Hive和數據庫比較

2 Hive安裝

2.1 hive下載地址

2.2 hive安裝部署

2.3 將本地文件導入Hive案例

2.4 Mysql安裝(root用戶)

2.4.1 安裝包準備

2.4.2 安裝mysql服務器

2.4.3 安裝mysql客戶端

2.4.4 mysql中user表的主機配置

2.5 將hive元數據配置到mysql

2.5.1 驅動拷貝

2.5.2 配置Metastore到MySql

2.5.3 多窗口啓動Hive測試

2.6 Hive常用交互命令

2.7 Hive其他命令操作

2.8 Hive常見屬性配置

2.8.1 Hive數據倉庫位置配置

2.8.2 查詢後信息顯示配置

第3章 Hive數據類型

3.1 基本數據類型

3.3 類型轉化

第4章 DDL數據定義

4.1 創建數據庫

4.2 查詢數據庫

4.2.1 顯示數據庫

4.2.2 查看數據庫詳情

4.3.3 切換當前數據庫

4.4 刪除數據庫

4.5 創建表

4.5.1 管理表(內部表)

4.5.2 外部表


1 Hive基本概念

1.1 什麼是hive

hive:由Facebook開源用於解決海量結構化日誌的數據統計,Hive基於Hadoop來完成工作

Hive是基於Hadoop的一個數據倉庫工具(E抽取T轉換L加載),可以將結構化的數據文件映射爲一張表,並提供類SQL查詢功能。

Hive 構建在基於靜態批處理的Hadoop 之上,Hadoop 通常都有較高的延遲並且在作業提交和調度的時候需要大量的開銷。因此,Hive 並不能夠在大規模數據集上實現低延遲快速的查詢,例如,Hive 在幾百MB 的數據集上執行查詢一般有分鐘級的時間延遲。因此,Hive 並不適合那些需要低延遲的應用,例如,聯機事務處理(OLTP)。

Hive 查詢操作過程嚴格遵守Hadoop MapReduce 的作業執行模型,Hive 將用戶的HiveQL 語句通過解釋器轉換爲MapReduce 作業提交到Hadoop 集羣上,Hadoop 監控作業執行過程,然後返回作業執行結果給用戶。

本質上:是將HQL轉換成MapReduce程序

1.2 hive的特點

1.2.1 優點

  1. 操作接口採用類SQL語法,提供快速開發的能力(簡單、容易上手)。
  2. 避免了去寫MapReduce,減少開發人員的學習成本。
  3. Hive的執行延遲比較高,因此Hive常用於數據分析,對實時性要求不高的場合。
  4. Hive優勢在於處理大數據,對於處理小數據沒有優勢,因爲Hive的執行延遲比較高。Select length(345) from dual;
  5. Hive支持用戶自定義函數,用戶可以根據自己的需求來實現自己的函數。

1.2.2 缺點

  1. 1.Hive的HQL表達能力有限
    1. 迭代式算法無法表達
    2. 數據挖掘方面不擅長
  2. Hive的效率比較低
    1. Hive自動生成的MapReduce作業,通常情況下不夠智能化
    2. Hive調優比較困難,粒度較粗

1.3 Hive架構原理

1.用戶接口:Client

CLI(hive shell)、JDBC/ODBC(java訪問hive)、WEBUI(瀏覽器訪問hive)

2.元數據:Metastore

元數據包括:表名、表所屬的數據庫(默認是default)、表的擁有者、列/分區字段、表的類型(是否是外部表)、表的數據所在目錄等;

默認存儲在自帶的derby數據庫中,推薦使用MySQL存儲Metastore

3.Hadoop

使用HDFS進行存儲,使用MapReduce進行計算。

4.驅動器:Driver

  1. 解析器(SQL Parser):將SQL字符串轉換成抽象語法樹AST,這一步一般都用第三方工具庫完成,比如antlr;對AST進行語法分析,比如表是否存在、字段是否存在、SQL語義是否有誤。
  2. 編譯器(Physical Plan):將AST編譯生成邏輯執行計劃。
  3. 優化器(Query Optimizer):對邏輯執行計劃進行優化。
  4. 執行器(Execution):把邏輯執行計劃轉換成可以運行的物理計劃。對於Hive來說,就是MR/Spark。

Hive通過給用戶提供的一系列交互接口,接收到用戶的指令(SQL),使用自己的Driver,結合元數據(MetaStore),將這些指令翻譯成MapReduce,提交到Hadoop中執行,最後,將執行返回的結果輸出到用戶交互接口。

1.4 Hive和數據庫比較

hive是一個翻譯工具,將sql翻譯爲底層的MapReduce程序,它不是一個數據庫,雖然在表現形式上與數據庫有很多的類似(比如database、表、字段等)

由於 Hive 採用了類似SQL 的查詢語言 HQL(Hive Query Language),因此很容易將 Hive 理解爲數據庫。其實從結構上來看,Hive 和數據庫除了擁有類似的查詢語言,再無類似之處。下面將從多個方面來闡述 Hive 和數據庫的差異。數據庫可以用在 Online(在線) 的應用中,但是Hive 是爲數據倉庫而設計的,清楚這一點,有助於從應用角度理解 Hive 的特性。

1. 查詢語言

由於SQL被廣泛的應用在數據倉庫中,因此,專門針對Hive的特性設計了類SQL的查詢語言HQL。熟悉SQL開發的開發者可以很方便的使用Hive進行開發。

2. 數據存儲位置

Hive 是建立在 Hadoop 之上的,所有 Hive 的數據都是存儲在 HDFS 中的。而數據庫則可以將數據保存在塊設備或者本地文件系統中。

3. 數據更新

由於Hive是針對數據倉庫應用設計的,而數據倉庫的內容是讀多寫少的。因此,Hive中不建議對數據的改寫,所有的數據都是在加載的時候確定好的。而數據庫中的數據通常是需要經常進行修改的,因此可以使用 INSERT INTO …  VALUES 添加數據,使用 UPDATE … SET修改數據。

4. 索引

Hive在加載數據的過程中不會對數據進行任何處理,甚至不會對數據進行掃描,因此也沒有對數據中的某些Key建立索引。Hive要訪問數據中滿足條件的特定值時,需要暴力掃描整個數據,因此訪問延遲較高。由於 MapReduce 的引入, Hive 可以並行訪問數據,因此即使沒有索引,對於大數據量的訪問,Hive 仍然可以體現出優勢。數據庫中,通常會針對一個或者幾個列建立索引,因此對於少量的特定條件的數據的訪問,數據庫可以有很高的效率,較低的延遲。由於數據的訪問延遲較高,決定了 Hive 不適合在線數據查詢。

5. 執行

Hive中大多數查詢的執行是通過 Hadoop 提供的 MapReduce 來實現的。而數據庫通常有自己的執行引擎,比如innoDb引擎等

6. 執行延遲

Hive 在查詢數據的時候,由於沒有索引,需要掃描整個表,因此延遲較高。另外一個導致 Hive 執行延遲高的因素是 MapReduce框架。由於MapReduce 本身具有較高的延遲,因此在利用MapReduce 執行Hive查詢時,也會有較高的延遲。相對的,數據庫的執行延遲較低。當然,這個低是有條件的,即數據規模較小,當數據規模大到超過數據庫的處理能力的時候,Hive的並行計算顯然能體現出優勢。

7. 可擴展性

由於Hive是建立在Hadoop之上的,因此Hive的可擴展性是和Hadoop的可擴展性是一致的(世界上最大的Hadoop 集羣在 百度!,2015年的規模在1.3萬 臺節點左右)。而數據庫由於 ACID 語義的嚴格限制,擴展行非常有限。目前最先進的並行數據庫 Oracle 在理論上的擴展能力也只有100臺左右。

8. 數據規模

由於Hive建立在集羣上並可以利用MapReduce進行並行計算,因此可以支持很大規模的數據;對應的,數據庫可以支持的數據規模較小。

2 Hive安裝

2.1 hive下載地址

1.Hive官網地址:http://hive.apache.org/

2.文檔查看地址:https://cwiki.apache.org/confluence/display/Hive/GettingStarted

3.下載地址:http://archive.apache.org/dist/hive/

4.網盤下載 鏈接:請點這裏   提取碼:ksej 

2.2 hive安裝部署

1.  hive安裝及配置

(1)把apache-hive-1.2.1-bin.tar.gz上傳到linux的/opt/software目錄下

(2)解壓apache-hive-1.2.1-bin.tar.gz到/opt/module/目錄下面

[hadoop@hadoop101 software]$ tar -zxvf apache-hive-1.2.1-bin.tar.gz -C /opt/module/

(3)修改apache-hive-1.2.1-bin.tar.gz的名稱爲hive

[hadoop@hadoop101 module]$ mv apache-hive-1.2.1-bin/ hive

(4)修改/opt/module/hive/conf目錄下的hive-env.sh.template名稱爲hive-env.sh

[hadoop@hadoop101 conf]$ mv hive-env.sh.template hive-env.sh

(5)配置hive-env.sh文件 

(a)配置HADOOP_HOME路徑

export HADOOP_HOME=/opt/module/hadoop-2.7.2

(b)配置HIVE_CONF_DIR路徑

export HIVE_CONF_DIR=/opt/module/hive/conf

2.  Hadoop集羣配置

(1)必須啓動hdfs和yarn

[hadoop@hadoop101 hadoop-2.7.2]$ sbin/start-dfs.sh

[hadoop@hadoop102 hadoop-2.7.2]$ sbin/start-yarn.sh

  1. 在HDFS上創建/tmp和/user/hive/warehouse兩個目錄並修改他們的同組權限可寫

[root@hadoop101 hadoop-2.7.2]$ bin/hadoop fs -mkdir /tmp

[root@hadoop101 hadoop-2.7.2]$ bin/hadoop fs -mkdir -p /user/hive/warehouse

[root@hadoop101 hadoop-2.7.2]$ bin/hadoop fs -chmod g+w /tmp

[root@hadoop101 hadoop-2.7.2]$ bin/hadoop fs -chmod g+w /user/hive/warehouse

或者在配置文件中關閉權限檢查  在hadoop 的hdfs-site.xml 中

<property>

        <name>dfs.permissions.enable</name>

        <value>false</value>

</property>

3.Hive基本操作

(1)啓動hive

[root@hadoop101 hive]$ bin/hive

(2)查看數據庫

hive> show databases;

(3)打開默認數據庫

hive> use default;

(4)顯示default數據庫中的表

hive> show tables;

(5)創建一張表

hive> create table student(id int, name string);

(6)顯示數據庫中有幾張表

hive> show tables;

(7)查看錶的結構

hive> desc student;

(8)向表中插入數據

hive> insert into student values(1000,"ss");

(9)查詢表中數據

hive> select * from student;

(10)退出hive

hive> quit/exit;

2.3 將本地文件導入Hive案例

需求

將本地/opt/module/datas/student.txt這個目錄下的數據導入到hive的student(id int, name string)表中。

1.數據準備

在/opt/module/datas這個目錄下準備數據

(1)在/opt/module/目錄下創建datas

[root@hadoop101 module]$ mkdir datas

(2)在/opt/module/datas/目錄下創建student.txt文件並添加數據

[root@hadoop101 datas]$ touch student.txt

[root@hadoop101 datas]$ vim student.txt

1001 zhangshan

1002 lishi

1003 zhaoliu

注意以tab鍵間隔。

2.Hive實際操作

(1)啓動hive

[root@hadoop101 hive]$ bin/hive

(2)顯示數據庫

hive> show databases;

(3)使用default數據庫

hive> use default;

(4)顯示default數據庫中的表

hive> show tables;

(5)刪除已創建的student表

hive> drop table student;

(6)創建student表, 並聲明文件分隔符’\t’

         hive> create table student(id int, name string)  ROW  FORMAT  DELIMITED  FIELDS  TERMINATED  BY '\t';

(7)加載/opt/module/datas/student.txt 文件到student數據庫表中。  雙引號也可以

hive> load data local inpath '/opt/module/datas/student.txt' into table student;

(8)Hive查詢結果

hive> select * from student;

OK

1001 zhangshan

1002 lishi

1003 zhaoliu

Time taken: 0.266 seconds, Fetched: 3 row(s)

3.遇到的問題

再打開一個客戶端窗口啓動hive,會產生java.sql.SQLException異常。

Exception in thread "main" java.lang.RuntimeException: java.lang.RuntimeException:

 Unable to instantiate

 org.apache.hadoop.hive.ql.metadata.SessionHiveMetaStoreClient

        at org.apache.hadoop.hive.ql.session.SessionState.start(SessionState.java:522)

        at org.apache.hadoop.hive.cli.CliDriver.run(CliDriver.java:677)

        at org.apache.hadoop.hive.cli.CliDriver.main(CliDriver.java:621)

        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)

        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)

        at java.lang.reflect.Method.invoke(Method.java:606)

        at org.apache.hadoop.util.RunJar.run(RunJar.java:221)

        at org.apache.hadoop.util.RunJar.main(RunJar.java:136)

Caused by: java.lang.RuntimeException: Unable to instantiate org.apache.hadoop.hive.ql.metadata.SessionHiveMetaStoreClient

        at org.apache.hadoop.hive.metastore.MetaStoreUtils.newInstance(MetaStoreUtils.java:1523)

        at org.apache.hadoop.hive.metastore.RetryingMetaStoreClient.<init>(RetryingMetaStoreClient.java:86)

        at org.apache.hadoop.hive.metastore.RetryingMetaStoreClient.getProxy(RetryingMetaStoreClient.java:132)

        at org.apache.hadoop.hive.metastore.RetryingMetaStoreClient.getProxy(RetryingMetaStoreClient.java:104)

        at org.apache.hadoop.hive.ql.metadata.Hive.createMetaStoreClient(Hive.java:3005)

        at org.apache.hadoop.hive.ql.metadata.Hive.getMSC(Hive.java:3024)

        at org.apache.hadoop.hive.ql.session.SessionState.start(SessionState.java:503)

... 8 more

原因是,Metastore默認存儲在自帶的derby數據庫中,不允許多人同時訪問,推薦使用MySQL存儲Metastore;

2.4 Mysql安裝(root用戶)

2.4.1 安裝包準備

1.查看mysql是否安裝,如果安裝了,卸載mysql

(1)查看

[root@hadoop101 桌面]# rpm -qa|grep mysql

mysql-libs-5.1.73-7.el6.x86_64

(2)卸載

[root@hadoop101 桌面]# rpm -e --nodeps mysql-libs-5.1.73-7.el6.x86_64

2.解壓mysql-libs.zip文件到當前目錄

[root@hadoop101 software]# unzip mysql-libs.zip

[root@hadoop101 software]# ls

mysql-libs.zip

mysql-libs

3.進入到mysql-libs文件夾下

[root@hadoop101 mysql-libs]# ll

-rw-r--r--. 1 root root 18509960 3月  26 2015 MySQL-client-5.6.24-1.el6.x86_64.rpm

-rw-r--r--. 1 root root  3575135 12月  1 2013 mysql-connector-java-5.1.27.tar.gz

-rw-r--r--. 1 root root 55782196 3月  26 2015 MySQL-server-5.6.24-1.el6.x86_64.rpm

2.4.2 安裝mysql服務器

1.安裝mysql服務端

[hadoop@hadoop101 mysql-libs]# rpm -ivh MySQL-server-5.6.24-1.el6.x86_64.rpm,

報錯需要安裝mysql的依賴

安裝mysql的依賴庫   

yum install perl

yum install net-tools

2.查看產生的隨機密碼

[root@hadoop101 mysql-libs]# cat /root/.mysql_secret

OEXaQuS8IWkG19Xs

3.查看mysql狀態

[root@hadoop101 mysql-libs]# service mysql status

4.啓動mysql

[root@hadoop101 mysql-libs]# service mysql start

2.4.3 安裝mysql客戶端

1.安裝mysql客戶端

[root@hadoop101 mysql-libs]# rpm -ivh MySQL-client-5.6.24-1.el6.x86_64.rpm

2.連接mysql

[hadoop@hadoop101 mysql-libs]# mysql -uroot -pOEXaQuS8IWkG19Xs

3.修改密碼

mysql>SET PASSWORD=PASSWORD('000000'); (大小寫均可)

4.退出mysql

mysql>exit;

2.4.4 mysql中user表的主機配置

配置只要是root用戶+密碼,在任何主機上都能登錄MySQL數據庫(可遠程訪問)。

1.進入數據庫查詢user表數據

mysql>select user, host, password from user;  (大小寫均可)

2.修改user表,把Host字段內容修改爲%

mysql>update user set host='%' where host='localhost';

3.刪除root用戶的其他host

mysql>delete from user where Host='hadoop102';

mysql>delete from user where Host='127.0.0.1';

mysql>delete from user where Host='::1';

4.刷新之後,即可退出,然後在本機遠程連接linux上的數據庫進行測試

mysql>flush privileges;

2.5 將hive元數據配置到mysql

2.5.1 驅動拷貝

1.在/opt/software/mysql-libs目錄下解壓mysql-connector-java-5.1.27.tar.gz驅動包

[hadoop@hadoop101 mysql-libs]# tar -zxvf mysql-connector-java-5.1.27.tar.gz

2.拷貝/opt/software/mysql-libs/mysql-connector-java-5.1.27目錄下的mysql-connector-java-5.1.27-bin.jar到/opt/module/hive/lib/

[root@hadoop101 mysql-connector-java-5.1.27]# cp mysql-connector-java-5.1.27-bin.jar  /opt/module/hive/lib/

2.5.2 配置Metastore到MySql

1.在/opt/module/hive/conf目錄下創建一個hive-site.xml

[root@hadoop101 conf]$ touch hive-site.xml

[root@hadoop101 conf]$ vi hive-site.xml

2.根據官方文檔配置參數,拷貝數據到hive-site.xml文件中

https://cwiki.apache.org/confluence/display/Hive/AdminManual+MetastoreAdmin

<?xml version="1.0"?>

<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>

<configuration>

<property>

      <name>javax.jdo.option.ConnectionURL</name>

      <value>jdbc:mysql://hadoop101:3306/metastore?createDatabaseIfNotExist=true</value>

      <description>JDBC connect string for a JDBC metastore</description>

</property>

<property>

      <name>javax.jdo.option.ConnectionDriverName</name>

      <value>com.mysql.jdbc.Driver</value>

      <description>Driver class name for a JDBC metastore</description>

</property>

<property>

      <name>javax.jdo.option.ConnectionUserName</name>

      <value>root</value>

      <description>username to use against metastore database</description>

</property>

<property>

      <name>javax.jdo.option.ConnectionPassword</name>

      <value>000000</value>

      <description>password to use against metastore database</description>

</property>

</configuration>

3.配置完畢後,如果啓動hive異常,可以重新啓動虛擬機。(重啓後,別忘了啓動hadoop集羣)

2.5.3 多窗口啓動Hive測試

1.先啓動MySQL

[hadoop@hadoop101 mysql-libs]$ mysql -uroot -p000000

查看有幾個數據庫

mysql> show databases;

+--------------------+

| Database           |

+--------------------+

| information_schema |

| mysql             |

| performance_schema |

| test               |

+--------------------+

2.再次打開多個窗口,分別啓動hive

[hadoop@hadoop101 hive]$ bin/hive

3.啓動hive後,回到MySQL窗口查看數據庫,顯示增加了metastore數據庫

mysql> show databases;

+--------------------+

| Database           |

+--------------------+

| information_schema |

| metastore          |

| mysql             |

| performance_schema |

| test               |

+--------------------+

2.6 Hive常用交互命令

[hadoop@hadoop101 hive]$ bin/hive -help

usage: hive

 -d,--define <key=value>          Variable subsitution to apply to hive

                                  commands. e.g. -d A=B or --define A=B

    --database <databasename>     Specify the database to use

 -e <quoted-query-string>         SQL from command line

 -f <filename>                    SQL from files

 -H,--help                        Print help information

    --hiveconf <property=value>   Use value for given property

    --hivevar <key=value>         Variable subsitution to apply to hive

                                  commands. e.g. --hivevar A=B

 -i <filename>                    Initialization SQL file

 -S,--silent                      Silent mode in interactive shell

 -v,--verbose                     Verbose mode (echo executed SQL to the console)

1.“-e”不進入hive的交互窗口執行sql語句

[hadoop@hadoop101 hive]$ bin/hive -e "select id from student;"

2.“-f”執行腳本中sql語句

(1)在/opt/module/datas目錄下創建hivef.sql文件

[hadoop@hadoop101 datas]$ touch hivef.sql

文件中寫入正確的sql語句

select *from student;

(2)執行文件中的sql語句

[hadoop@hadoop101 hive]$ bin/hive -f /opt/module/datas/hivef.sql

(3)執行文件中的sql語句並將結果寫入文件中

[hadoop@hadoop101 hive]$ bin/hive -f /opt/module/datas/hivef.sql  > /opt/module/datas/hive_result.txt

2.7 Hive其他命令操作

1.退出hive窗口:exit/quit

2.查看在hive中輸入的所有歷史命令

(1)進入到當前用戶的根目錄/root

(2)查看. hivehistory文件

[bigdata@hadoop102 ~]$ cat  .hivehistory

2.8 Hive常見屬性配置

2.8.1 Hive數據倉庫位置配置

1)Default數據倉庫的最原始位置是在hdfs上的:/user/hive/warehouse路徑下。

2)在倉庫目錄下,沒有對默認的數據庫default創建文件夾。如果某張表屬於default數據庫,直接在數據倉庫目錄下創建一個文件夾。

3)修改default數據倉庫原始位置(將hive-default.xml.template如下配置信息拷貝到hive-site.xml文件中)。

<property>

<name>hive.metastore.warehouse.dir</name>

<value>/user/hive/warehouse</value>

<description>location of default database for the warehouse</description>

</property>

配置同組用戶有執行權限

bin/hdfs dfs -chmod g+w /user/hive/warehouse

2.8.2 查詢後信息顯示配置

1)在hive-site.xml文件中添加如下配置信息,就可以實現顯示當前數據庫,以及查詢表的頭信息配置。

<property>

<name>hive.cli.print.header</name>

<value>true</value>

</property>

<property>

<name>hive.cli.print.current.db</name>

<value>true</value>

</property>

2)重新啓動hive,對比配置前後差異。

(1)配置前

(2)配置後

2.8.3 Hive運行日誌信息配置

1.Hive的log默認存放在/tmp/root/hive.log目錄下(當前用戶名下)

2.修改hive的log存放日誌到/opt/module/hive/logs

(1)修改/opt/module/hive/conf/hive-log4j.properties.template文件名稱爲

hive-log4j.properties

[hadoop@hadoop101 conf]$ pwd

/opt/module/hive/conf

[hadoop@hadoop101 conf]$ mv hive-log4j.properties.template hive-log4j.properties

(2)在hive-log4j.properties文件中修改log存放位置

hive.log.dir=/opt/module/hive/logs

第3章 Hive數據類型

3.1 基本數據類型

Hive數據類型

Java數據類型

長度

例子

TINYINT

byte

1byte有符號整數

20

SMALINT

short

2byte有符號整數

20

INT

int

4byte有符號整數

20

BIGINT

long

8byte有符號整數

20

BOOLEAN

boolean

布爾類型,true或者false

TRUE  FALSE

FLOAT

float

單精度浮點數

3.14159

DOUBLE

double

雙精度浮點數

3.14159

STRING

string

字符系列。可以指定字符集。可以使用單引號或者雙引號。

‘now is the time’ “for all good men”

TIMESTAMP

 

時間類型

 

BINARY

 

字節數組

 

對於Hive的String類型相當於數據庫的varchar類型,該類型是一個可變的字符串,不過它不能聲明其中最多能存儲多少個字符,理論上它可以存儲2GB的字符數。

3.3 類型轉化

Hive的原子數據類型是可以進行隱式轉換的,類似於Java的類型轉換,例如某表達式使用INT類型,TINYINT會自動轉換爲INT類型,但是Hive不會進行反向轉化,例如,某表達式使用TINYINT類型,INT不會自動轉換爲TINYINT類型,它會返回錯誤

隱式類型轉換規則如下

(1)任何整數類型都可以隱式地轉換爲一個範圍更廣的類型,如TINYINT可以轉換成INT,INT可以轉換成BIGINT。

(2)所有整數類型、FLOAT和STRING類型都可以隱式地轉換成DOUBLE。

(3)TINYINT、SMALLINT、INT都可以轉換爲FLOAT。

(4)BOOLEAN類型不可以轉換爲任何其它的類型。

第4章 DDL數據定義

4.1 創建數據庫

1)創建一個數據庫,數據庫在HDFS上的默認存儲路徑是/user/hive/warehouse/*.db。

hive (default)> create database db_hive;

2)避免要創建的數據庫已經存在錯誤,增加if not exists判斷。(標準寫法)

hive (default)> create database db_hive;

FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask. Database db_hive already exists

hive (default)> create database if not exists db_hive;

3)創建一個數據庫,指定數據庫在HDFS上存放的位置

hive (default)> create database db_hive2 location '/db_hive2.db';

4.2 查詢數據庫

4.2.1 顯示數據庫

1.顯示數據庫

hive> show databases;

2.過濾顯示查詢的數據庫

hive> show databases like 'db_hive*';

db_hive

db_hive_1

4.2.2 查看數據庫詳情

1.顯示數據庫信息

hive> desc database db_hive;

db_hive hdfs://hadoop102:9000/user/hive/warehouse/db_hive.db bigdataUSER

4.3.3 切換當前數據庫

hive (default)> use db_hive;

4.4 刪除數據庫

1.刪除空數據庫

hive>drop database db_hive2;

2.如果刪除的數據庫不存在,最好採用 if exists判斷數據庫是否存在

hive> drop database db_hive;

FAILED: SemanticException [Error 10072]: Database does not exist: db_hive

hive> drop database if exists db_hive2;

3.如果數據庫不爲空,可以採用cascade命令,強制刪除

hive> drop database db_hive;

FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask. InvalidOperationException(message:Database db_hive is not empty. One or more tables exist.)

hive> drop database db_hive cascade;

4.5 創建表

1.建表語法

CREATE [EXTERNAL] TABLE [IF NOT EXISTS] table_name

[(col_name data_type [COMMENT col_comment], ...)]

[COMMENT table_comment]

[ROW FORMAT row_format]

[STORED AS file_format]

[LOCATION hdfs_path]

LIKE tablename

2.字段解釋說明  

(1)CREATE TABLE 創建一個指定名字的表。如果相同名字的表已經存在,則拋出異常;用戶可以用 IF NOT EXISTS 選項來忽略這個異常。

(2)EXTERNAL關鍵字可以讓用戶創建一個外部表,在建表的同時指定一個指向實際數據的路徑(LOCATION),Hive創建內部表時,會將數據移動到數據倉庫指向的路徑;若創建外部表,僅記錄數據所在的路徑,不對數據的位置做任何改變。在刪除表的時候,內部表的元數據和數據會被一起刪除,而外部表只刪除元數據,不刪除數據。

(3)COMMENT:爲表和列添加註釋。

(4)ROW FORMAT DELIMITED FIELDS TERMINATED BY char    以某個字符分割

(5)STORED AS指定存儲文件類型

常用的存儲文件類型:SEQUENCEFILE(二進制序列文件)、TEXTFILE(文本)、RCFILE(列式存儲格式文件)

如果文件數據是純文本,可以使用STORED AS TEXTFILE。如果數據需要壓縮,使用 STORED AS SEQUENCEFILE。

(6)LOCATION :指定表在HDFS上的存儲位置。

(7)LIKE允許用戶複製現有的表結構,但是不復制數據。 

如果當前創建的表create table table1,希望table1和已經存在的table0的表結構相同,就可以使用like指令直接創建,create table table1 like table0;

 

4.5.1 管理表(內部表)

1.理論

默認創建的表都是所謂的管理表,有時也被稱爲內部表。因爲這種表,Hive會(或多或少地)控制着數據的生命週期。Hive默認情況下會將這些表的數據存儲在由配置項hive.metastore.warehouse.dir(例如,/user/hive/warehouse)所定義的目錄的子目錄下。 當我們刪除一個管理表時,Hive也會刪除這個表中數據(元數據和表數據都會刪除掉)。管理表不適合和其他工具共享數據。

2.案例實操

(1)普通創建表

create  table  if  not  exists  student3(id int, name string)  row  format  delimited  fields  terminated  by  '\t'   stored  as  textfile  location  '/user/hive/warehouse/student3';

(2)根據查詢結果創建表(查詢的結果會添加到新創建的表中)

create table if not exists student3 as select id, name from student;

(3)根據已經存在的表結構創建表

create table if not exists student4 like student;

(4)查詢表的類型

hive (default)> desc formatted student2;

Table Type:             MANAGED_TABLE  

4.5.2 外部表

1.理論

因爲外部表,所以Hive並非認爲其完全擁有這份數據。刪除該表並不會刪除掉這份數據,不過描述表的元數據信息會被刪除掉。

2.管理表和外部表的使用場景

每天將收集到的網站日誌定期流入HDFS文本文件。在外部表(原始日誌表)的基礎上做大量的統計分析,用到的中間表、結果表使用內部表存儲,數據通過SELECT+INSERT進入內部表。

部門表 10    ACCOUNTING    1700
20    RESEARCH    1800
30    SALES    1900
40    OPERATIONS    1700
員工表 7369    SMITH    CLERK    7902    1980-12-17    800.0    NULL    20
7499    ALLEN    SALESMAN    7698    1981-2-20    1600.0    300.0    30
7521    WARD    SALESMAN    7698    1981-2-22    1250.0    500.0    30
7566    JONES    MANAGER    7839    1981-4-2    2975.0    NULL    20
7654    MARTIN    SALESMAN    7698    1981-9-28    1250.0    1400.0    30
7698    BLAKE    MANAGER    7839    1981-5-1    2850.0    NULL    30
7782    CLARK    MANAGER    7839    1981-6-9    2450.0    NULL    10
7788    SCOTT    ANALYST    7566    1987-4-19    3000.0    NULL    20
7839    KING    PRESIDENT    NULL    1981-11-17    5000.0    NULL    10
7844    TURNER    SALESMAN    7698    1981-9-8    1500.0    0.0    30
7876    ADAMS    CLERK    7788    1987-5-23    1100.0    NULL    20
7900    JAMES    CLERK    7698    1981-12-3    950.0    NULL    30
7902    FORD    ANALYST    7566    1981-12-3    3000.0    NULL    20
7934    MILLER    CLERK    7782    1982-1-23    1300.0    NULL    10

創建部門表

create external table if not exists dept(

deptno int,

dname string,

loc int

)

row format delimited fields terminated by '\t';

創建員工表

create external table if not exists emp(

empno int,

ename string,

job string,

mgr int,

hiredate string,

sal double,

comm double,

deptno int)

row format delimited fields terminated by '\t';

(3)查看創建的表

hive (default)> show tables;

tab_name

dept

emp

(4)向外部表中導入數據

導入數據

hive (default)> load data local inpath '/opt/module/datas/dept.txt' into table default.dept;

hive (default)> load data local inpath '/opt/module/datas/emp.txt' into table default.emp;

查詢結果

hive (default)> select * from emp;

hive (default)> select * from dept;

(5)查看錶格式化數據

hive (default)> desc formatted dept;

Table Type:             EXTERNAL_TABLE

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章