第1章 Hive入門1.1 什麼是Hive1.2 Hive的優缺點1.2.1 優勢1.2.2 缺點1.3 Hive架構原理1.4 Hive和數據庫比較1.4.1 查詢語言1.4.2 數據存儲位置1.4.3 數據更新1.4.4 索引1.4.5 執行1.4.6 執行延遲1.4.7 可擴展性1.4.8 數據規模第2章 Hive安裝、配置和使用2.1 Hive安裝地址2.2 Hive安裝部署2.3 將本地文件導入Hive案例2.4 MySql安裝2.4.1 安裝包準備2.4.2 安裝MySql服務器2.4.3 安裝MySql客戶端2.4.4 MySql中user表中主機配置2.5 Hive元數據配置到MySql2.5.1 驅動拷貝2.5.2 配置metastore到MySql2.5.3 多窗口啓動Hive測試2.6 Hive JDBC訪問2.6.1 啓動hiveserver2服務2.6.2 啓動beeline2.6.3 鏈接hiveserver22.7 Hive經常使用交互命令2.8 Hive其餘命令操做2.9 Hive常見屬性配置2.9.1 Hive數據倉庫位置配置2.9.2 Hive查詢後信息顯示配置2.9.3 Hive運行日誌信息配置2.9.4 Hive參數配置方式第3章 Hive數據類型3.1 基本數據類型3.2 集合數據類型3.3 類型轉化php
Hive:由Facebook開源用於解決海量結構化日誌的數據統計(分析數據的框架)。
Hive是基於Hadoop的一個數據倉庫工具
,能夠將結構化的數據文件映射爲一張表
,並提供類SQL
查詢功能。
本質是:將HQL轉化成MapReduce程序
。css
1) 操做接口採用類SQL語法
,提供快速開發的能力(簡單、容易上手)。
2) 避免了去寫MapReduce,減小開發人員的學習成本。
3) Hive的執行延遲比較高
,所以Hive經常使用於數據分析,對實時性要求不高的場合。
4) Hive優點在於處理大數據,對於處理小數據沒有優點,由於Hive的執行延遲比較高。
5) Hive支持用戶自定義函數,用戶能夠根據本身的需求來實現本身的函數,擴展性好。java
一、Hive的HQL表達能力有限
(1)迭代式算法沒法表達(算法,機器學習,即多個MapReduce串聯的侷限性)
(2)數據挖掘方面不擅長(不善於「啤酒+紙尿布案列」,善於數據分析)
二、Hive的效率比較低
(1)Hive自動生成的MapReduce做業,一般狀況下不夠智能化
(2)Hive調優比較困難,粒度較粗node
一、用戶接口:Client
CLI(hive shell)、JDBC/ODBC(java訪問hive)、WEBUI(瀏覽器訪問hive)
二、元數據:Metastore
元數據包括:表名、表所屬的數據庫(默認是default)、表的擁有者、列/分區字段、表的類型(是不是外部表)、表的數據所在目錄等。
默認存儲在自帶的derby數據庫中,推薦使用MySQL存儲Metastore。
三、Hadoop
使用HDFS進行存儲,使用MapReduce進行計算。
四、驅動器:Driver
(1)解析器(SQL Parser):將SQL字符串轉換成抽象語法樹AST,這一步通常都用第三方工具庫完成,好比antlr;對AST進行語法分析,好比表是否存在、字段是否存在、SQL語義是否有誤。
(2)編譯器(Physical Plan):將AST編譯生成邏輯執行計劃。
(3)優化器(Query Optimizer):對邏輯執行計劃進行優化。
(4)執行器(Execution):把邏輯執行計劃轉換成能夠運行的物理計劃。對於Hive來講,就是MR/Spark。mysql
因爲 Hive 採用了相似SQL 的查詢語言 HQL(Hive Query Language),所以很容易將 Hive 理解爲數據庫。其實從結構上來看,Hive 和數據庫除了擁有相似的查詢語言,再無相似之處。本文將從多個方面來闡述 Hive 和數據庫的差別。數據庫能夠用在 Online 的應用中,可是 Hive 是爲數據倉庫而設計的,清楚這一點,有助於從應用角度理解 Hive 的特性。linux
因爲SQL被普遍的應用在數據倉庫中,所以,專門針對 Hive 的特性設計了類SQL的查詢語言HQL。熟悉SQL開發的開發者能夠很方便的使用 Hive 進行開發。git
Hive 是創建在 Hadoop 之上的,全部 Hive 的數據都是存儲在 HDFS 中的。而數據庫則能夠將數據保存在塊設備或者本地文件系統中。github
因爲 Hive 是針對數據倉庫應用設計的,而數據倉庫的內容是讀多寫少的
。所以,Hive 中不建議對數據的改寫,全部的數據都是在加載的時候肯定好的
。而數據庫中的數據一般是須要常常進行修改的,所以可使用 INSERT INTO … VALUES 添加數據,使用 UPDATE … SET修改數據。算法
Hive 在加載數據的過程當中不會對數據進行任何處理,甚至不會對數據進行掃描,所以也沒有對數據中的某些Key創建索引。Hive 要訪問數據中知足條件的特定值時,須要暴力掃描整個數據
,所以訪問延遲較高。因爲 MapReduce 的引入, Hive 能夠並行訪問數據,所以即便沒有索引,對於大數據量的訪問,Hive 仍然能夠體現出優點。數據庫中,一般會針對一個或者幾個列創建索引,所以對於少許的特定條件的數據的訪問,數據庫能夠有很高的效率,較低的延遲。因爲數據的訪問延遲較高,決定了 Hive 不適合在線數據查詢。sql
Hive 中大多數查詢的執行是經過 Hadoop 提供的 MapReduce 來實現的。而數據庫一般有本身的執行引擎。
Hive 在查詢數據的時候,因爲沒有索引,須要掃描整個表,所以延遲較高。另一個致使 Hive 執行延遲高的因素是 MapReduce 框架。因爲MapReduce 自己具備較高的延遲,所以在利用 MapReduce 執行 Hive 查詢時,也會有較高的延遲。相對的,數據庫的執行延遲較低。固然,這個低是有條件的,即數據規模較小,當數據規模大到超過數據庫的處理能力的時候,Hive的並行計算顯然能體現出優點。
因爲 Hive 是創建在 Hadoop 之上的,所以 Hive 的可擴展性是和 Hadoop 的可擴展性是一致的(世界上最大的 Hadoop 集羣在 Yahoo!,2009年的規模在 4000 臺節點左右)。而數據庫因爲 ACID 語義的嚴格限制,擴展行很是有限。目前最早進的並行數據庫 Oracle 在理論上的擴展能力也只有100臺左右。
因爲 Hive 創建在集羣上並能夠利用 MapReduce 進行並行計算,所以能夠支持很大規模的數據;對應的,數據庫能夠支持的數據規模較小。
一、Hive官網地址
http://hive.apache.org/
一、Hive安裝及配置
(1)把apache-hive-1.2.1-bin.tar.gz上傳到linux的/opt/software目錄下
(2)解壓apache-hive-1.2.1-bin.tar.gz到/opt/module/目錄下面
[atguigu@hadoop102 software]$ tar -zxvf apache-hive-1.2.1-bin.tar.gz -C /opt/module/
(3)修改apache-hive-1.2.1-bin.tar.gz的名稱爲hive
[atguigu@hadoop102 module]$ mv apache-hive-1.2.1-bin/ hive
(4)修改/opt/module/hive/conf目錄下的hive-env.sh.template名稱爲hive-env.sh
[atguigu@hadoop102 conf]$ cp hive-env.sh.template hive-env.sh
(5)配置hive-env.sh文件
(a)配置HADOOP_HOME路徑
# Set HADOOP_HOME to point to a specific hadoop install directory
HADOOP_HOME=/opt/module/hadoop-2.7.2
(b)配置HIVE_CONF_DIR路徑
# Hive Configuration Directory can be controlled by:
export HIVE_CONF_DIR=/opt/module/hive/conf
(6)配置HIVE_HOME
[atguigu@hadoop102 ~]$ sudo vim /etc/profile
添加的內容以下:
#HIVE_HOME
export HIVE_HOME=/opt/module/hive
export PATH=$PATH:$HIVE_HOME/bin
:wq 保存退出
使配置文件生效
[atguigu@hadoop102 ~]$ source /etc/profile
二、Hadoop集羣配置
(1)在啓動Hive以前,必須先啓動hdfs和yarn
[atguigu@hadoop102 hadoop-2.7.2]$ sbin/start-dfs.sh
[atguigu@hadoop103 hadoop-2.7.2]$ sbin/start-yarn.sh
(2)在HDFS上建立/tmp和/user/hive/warehouse兩個目錄並修改他們的同組權限可寫
[atguigu@hadoop102 hadoop-2.7.2]$ bin/hadoop fs -mkdir /tmp
[atguigu@hadoop102 hadoop-2.7.2]$ bin/hadoop fs -mkdir -p /user/hive/warehouse
[atguigu@hadoop102 hadoop-2.7.2]$ bin/hadoop fs -chmod g+w /tmp
[atguigu@hadoop102 hadoop-2.7.2]$ bin/hadoop fs -chmod g+w /user/hive/warehouse
三、Hive基本操做
(1)啓動hive
[atguigu@hadoop102 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;
需求:將本地/opt/module/datas/student.txt這個目錄下的數據導入到hive的student(id int, name string)表中。
一、數據準備
在/opt/module/datas這個目錄下準備數據
(1)在/opt/module/目錄下建立datas
[atguigu@hadoop102 module]$ mkdir datas
(2)在/opt/module/datas/目錄下建立student.txt文件並添加數據
[atguigu@hadoop102 datas]$ touch student.txt
[atguigu@hadoop102 datas]$ vim student.txt
1001 zhangshan
1002 lishi
1003 zhaoliu
注意以tab鍵間隔。
二、Hive實際操做
(1)啓動hive
[atguigu@hadoop102 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)
三、遇到的問題
再打開一個客戶端窗口啓動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:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
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數據庫中,derby數據庫是單一用戶的,因此推薦使用MySQL存儲Metastore
。
一、查看mysql是否安裝,若是安裝了,卸載mysql
(1)查看
[root@hadoop102 桌面]# rpm -qa | grep mysql
mysql-libs-5.1.73-7.el6.x86_64
(2)卸載
[root@hadoop102 桌面]# rpm -e --nodeps mysql-libs-5.1.73-7.el6.x86_64
二、解壓mysql-libs.zip文件到當前目錄
[root@hadoop102 software]# unzip mysql-libs.zip
[root@hadoop102 software]# ls
mysql-libs.zip
mysql-libs
三、進入到mysql-libs文件夾下
[root@hadoop102 mysql-libs]# ll
總用量 76048
-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
一、安裝mysql服務端
[root@hadoop102 mysql-libs]# rpm -ivh MySQL-server-5.6.24-1.el6.x86_64.rpm
二、查看產生的隨機密碼
[root@hadoop102 mysql-libs]# cat /root/.mysql_secret
# The random password set for the root user at Sun Feb 24 18:13:37 2019 (local time): PyxYLBK4tABK1cZb
三、查看mysql狀態
[root@hadoop102 mysql-libs]# service mysql status
四、啓動mysql
[root@hadoop102 mysql-libs]# service mysql start
一、安裝mysql客戶端
[root@hadoop102 mysql-libs]# rpm -ivh MySQL-client-5.6.24-1.el6.x86_64.rpm
二、鏈接mysql
[root@hadoop102 mysql-libs]# mysql -uroot -pOEXaQuS8IWkG19Xs
三、修改密碼
mysql> set password=password("123456");
四、退出mysql
mysql> exit
五、從新登陸mysql
[root@hadoop102 mysql-libs]# mysql -uroot -p123456
配置只要是root用戶+密碼,在任何主機上都能登陸MySQL數據庫。即配置MySQL無主機登陸。
一、進入mysql
[root@hadoop102 mysql-libs]# mysql -uroot -p123456
二、顯示數據庫
mysql> show databases;
三、使用mysql數據庫
mysql> use mysql;
四、展現mysql數據庫中的全部表
mysql> show tables;
五、展現user表的結構
mysql> desc user;
六、查詢user表
mysql> select User, Host, Password from user;
七、修改user表,把Host表內容修改成%,%表示通配符的意思
mysql> update user set host='%' where host='localhost';
八、刪除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';
九、刷新
mysql> flush privileges;
十、退出
mysql> quit;
一、在/opt/software/mysql-libs目錄下解壓mysql-connector-java-5.1.27.tar.gz驅動包
[root@hadoop102 mysql-libs]# tar -zxvf mysql-connector-java-5.1.27.tar.gz
二、拷貝/opt/software/mysql-libs/mysql-connector-java-5.1.27目錄下的mysql-connector-java-5.1.27-bin.jar到/opt/module/hive/lib/
[root@hadoop102 mysql-connector-java-5.1.27]# cp mysql-connector-java-5.1.27-bin.jar /opt/module/hive/lib/
一、在/opt/module/hive/conf目錄下建立一個hive-site.xml
[atguigu@hadoop102 conf]$ touch hive-site.xml
[atguigu@hadoop102 conf]$ vim hive-site.xml
二、根據官方文檔配置參數,拷貝數據到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://hadoop102: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>123456</value>
<description>password to use against metastore database</description>
</property>
</configuration>
三、配置完畢後,若是啓動hive異常,能夠從新啓動虛擬機。(重啓後,別忘了啓動hadoop集羣)
一、先啓動MySQL
[atguigu@hadoop102 mysql-libs]$ mysql -uroot -p123456
查看有幾個數據庫
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| test |
+--------------------+
二、再次打開多個窗口,分別啓動hive,發現沒有問題,由於MySQL是多用戶模式。
[atguigu@hadoop102 hive]$ bin/hive
三、啓動hive後,回到MySQL窗口查看數據庫,顯示增長了metastore數據庫
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| metastore |
| mysql |
| performance_schema |
| test |
+--------------------+
[atguigu@hadoop102 hive]$ bin/hiveserver2
[atguigu@hadoop102 hive]$ bin/beeline
Beeline version 1.2.1 by Apache Hive
beeline>
beeline> !connect jdbc:hive2://hadoop102:10000(回車)
Connecting to jdbc:hive2://hadoop102:10000
Enter username for jdbc:hive2://hadoop102:10000: atguigu(回車)
Enter password for jdbc:hive2://hadoop102:10000: (直接回車)
Connected to: Apache Hive (version 1.2.1)
Driver: Hive JDBC (version 1.2.1)
Transaction isolation: TRANSACTION_REPEATABLE_READ
0: jdbc:hive2://hadoop102:10000> show databases;
+----------------+--+
| database_name |
+----------------+--+
| default |
| hive_db2 |
+----------------+--+
應用於:作定時任務。
[atguigu@hadoop102 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)
[atguigu@hadoop102 hive]$
0、因爲咱們更換了數據庫爲MySQL,爲了下面的演示方便,咱們須要先作一些準備工做:
hive> show databases;
hive> create table student(id int, name string) row format delimited fields terminated by '\t';
hive> select * from student;
OK
1001 zhangshan
1002 lishi
1003 zhaoliu
一、「-e」不進入hive的交互窗口執行sql語句
[atguigu@hadoop102 hive]$ bin/hive -e "select id from student;"
二、「-f」執行腳本中sql語句
(1)在/opt/module/datas目錄下建立hivef.sql文件
[atguigu@hadoop102 datas]$ touch hivef.sql
文件中寫入正確的sql語句
select * from student;
(2)執行文件中的sql語句
[atguigu@hadoop102 hive]$ bin/hive -f /opt/module/datas/hivef.sql
(3)執行文件中的sql語句並將結果寫入文件中
[atguigu@hadoop102 hive]$ bin/hive -f /opt/module/datas/hivef.sql > /opt/module/datas/hive_result.txt
一、退出hive窗口:
hive(default)> exit;
hive(default)> quit;
在新版的hive中沒區別了,在之前的版本是有的:
exit:先隱性提交數據,再退出。
quit:不提交數據,直接退出。
二、在hive cli命令窗口中如何查看hdfs文件系統
hive(default)> dfs -ls /;
三、在hive cli命令窗口中如何查看本地文件系統
hive(default)> ! ls /opt/module/datas;
四、查看在hive中輸入的全部歷史命令
(1)進入到當前用戶的根目錄/root或/home/atguigu
(2)查看.hivehistory文件
[atguigu@hadoop102 ~]$ cat .hivehistory
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>
配置同組用戶具備寫權限
[atguigu@hadoop102 hadoop-2.7.2]$ bin/hadoop fs -chmod g+w /user/hive/warehouse
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)配置前,以下圖所示:
一、Hive的log默認存放在/tmp/atguigu/hive.log目錄下(當前用戶名下),若是內存或者資源不夠會自動回收tmp文件夾,因此把重要的信息放到該目錄下不安全,須要更改。
二、修改hive的log存放日誌到/opt/module/hive/logs
(1)修改/opt/module/hive/conf/hive-log4j.properties.template文件名稱爲
hive-log4j.properties
atguigu@hadoop102 conf]$ pwd
/opt/module/hive/conf
[atguigu@hadoop102 conf]$ cp hive-log4j.properties.template hive-log4j.properties
(2)在hive-log4j.properties文件中修改log存放位置
hive.log.dir=/opt/module/hive/logs
一、查看當前全部的配置信息
hive> set;
二、參數的配置三種方式
(1)配置文件方式
默認配置文件:hive-default.xml.template
用戶自定義配置文件:hive-site.xml
注意:
用戶自定義配置會覆蓋默認配置。另外,Hive也會讀入Hadoop的配置,由於Hive是做爲Hadoop的客戶端啓動的,Hive的配置會覆蓋Hadoop的配置
。配置文件的設定對本機啓動的全部Hive進程都有效。
(2)命令行參數方式
啓動Hive時,能夠在命令行添加-hiveconf param=value
來設定參數。例如:
[atguigu@hadoop103 hive]$ bin/hive -hiveconf mapred.reduce.tasks=10;
注意:
僅對本次hive啓動有效。
查看參數設置:
hive (default)> set mapred.reduce.tasks;
(3)參數聲明方式
能夠在HQL中使用SET關鍵字設定參數例如:
hive (default)> set mapred.reduce.tasks=100;
注意:
僅對本次hive啓動有效。
查看參數設置
hive (default)> set mapred.reduce.tasks;
上述三種設定方式的優先級依次遞增
。即優先級:配置文件<命令行參數<參數聲明
。注意某些系統級的參數,例如log4j相關的設定,必須用前兩種方式設定,由於那些參數的讀取在會話創建之前已經完成了。
注意:
對於Hive的String類型至關於數據庫的varchar類型,該類型是一個可變的字符串,不過它不能聲明其中最多能存儲多少個字符,理論上它能夠存儲2GB的字符數。
{
"name": "songsong",
"friends": ["bingbing", "lili"] , // 列表Array,
"children": { // 鍵值Map,
"xiao song": 18 ,
"xiaoxiao song": 19
}
"address": { // 結構Struct,
"street": "hui long guan" ,
"city": "beijing"
}
}
2)基於上述數據結構,咱們在Hive裏建立對應的表,並導入數據。
建立本地測試文件test.txt
songsong,bingbing_lili,xiao song:18_xiaoxiao song:19,hui long guan_beijing
yangyang,caicai_susu,xiao yang:18_xiaoxiao yang:19,chao yang_beijing
注意:
MAP,STRUCT和ARRAY裏的元素間關係均可以用同一個字符表示,這裏用「_」。
3)Hive上建立測試表test
create table test(
name string,
friends array<string>,
children map<string, int>,
address struct<street:string, city:string>
)
row format delimited fields terminated by ','
collection items terminated by '_'
map keys terminated by ':'
lines terminated by '\n';
字段解釋:
row format delimited fields terminated by ',' -- 列分隔符
collection items terminated by '_' -- MAP、STRUCT 和 ARRAY 的分隔符(數據分割符號)
map keys terminated by ':' -- MAP中的key與value的分隔符
lines terminated by '\n'; -- 行分隔符
4)導入文本數據到測試表
hive (default)> load data local inpath ‘/opt/module/datas/test.txt’ into table test
或者
[atguigu@hadoop102 datas]$ hadoop fs -put test.txt /user/hive/warehouse/test
5)訪問三種集合列裏的數據,如下分別是ARRAY,MAP,STRUCT的訪問方式
hive> desc test;
OK
name string
friends array<string>
children map<string,int>
address struct<street:string,city:string>
Time taken: 1.032 seconds, Fetched: 4 row(s)
hive> select * from test;
OK
songsong ["bingbing","lili"] {"xiao song":18,"xiaoxiao song":19} {"street":"hui long guan","city":"beijing"}
yangyang ["caicai","susu"] {"xiao yang":18,"xiaoxiao yang":19} {"street":"chao yang","city":"beijing"}
Time taken: 0.274 seconds, Fetched: 2 row(s)
hive> select friends[1],children['xiao song'],address.city from test where name="songsong";
OK
lili 18 beijing
Time taken: 0.179 seconds, Fetched: 1 row(s)
Hive的原子數據類型是能夠進行隱式轉換的,相似於Java的類型轉換,例如某表達式使用INT類型,TINYINT會自動轉換爲INT類型,可是Hive不會進行反向轉化,例如,某表達式使用TINYINT類型,INT不會自動轉換爲TINYINT類型,它會返回錯誤,除非使用CAST操做。 一、隱式類型轉換規則以下 (1)任何整數類型均可以隱式地轉換爲一個範圍更廣的類型,如TINYINT能夠轉換成INT,INT能夠轉換成BIGINT。 (2)全部整數類型、FLOAT和STRING類型均可以隱式地轉換成DOUBLE。 (3)TINYINT、SMALLINT、INT均可以轉換爲FLOAT。 (4)BOOLEAN類型不能夠轉換爲任何其它的類型。 二、可使用CAST操做顯示進行數據類型轉換 例如:CAST('1' AS INT) 將把字符串'1' 轉換成整數1;若是強制類型轉換失敗,如執行CAST('X' AS INT),表達式返回空值NULL。