將本地文件導入Hive案例
如果嫌搗路徑麻煩,可以配置Hive的環境變量:
[root@bigdata111 hive-1.2.1]# cd /etc/profile
#HIVE_HOME
export HIVE_HOME=/opt/module/hive-1.2.1/
export PATH=$PATH:$HIVE_HOME/bin
使之生效:
[root@bigdata111 hive-1.2.1]# source /etc/profile
[root@bigdata111 hive-1.2.1]# hi
history hive hive-config.sh hiveserver2
這樣之后能給提示就成功配置環境變量了。
接下來將本地文件導入Hive
需求:將本地/opt/module/hiveTest/student.txt這個目錄下的數據導入到hive的student(id int, name string)表中。
1.數據准備:
在/opt/module/hiveTest/這個目錄下准備數據
(1)在/opt/module/目錄下創建hiveTest
[root@bigdata111 module]# mkdir hiveTest/
(2)在/opt/module/hiveTest/目錄下創建student.txt文件並添加數據
[root@bigdata111 module]# cd hiveTest/
[root@bigdata111 hiveTest]# vi student.txt
1001 zhangshan
1002 lishi
1003 zhaoliu
注意以tab鍵間隔。
2.Hive實際操作
(1)啟動hive
[root@bigdata111 hiveTest]# hive
(2)顯示數據庫
hive (default)> show databases;
(3)顯示default數據庫中的表
hive (default)> show tables;
(4)刪除已創建的student表
hive (default)> drop table student1;
(5)創建student表, 並聲明文件分隔符’\t’
hive> create table student(id int, name string) ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t';
hive (default)> create table student1 (id int,name string) row format delimited fields terminated by '\t';
可以進行查詢:
(6)加載/opt/module/datas/student.txt 文件到student數據庫表中。
hive (default)> load data local inpath '/opt/module/hiveTest/student.txt' into table student1;
(7)Hive查詢結果
hive (default)> select * from student1;
OK
student1.id student1.name
1001 zhangsan
1002 lisi
1003 zhaoliu
Time taken: 0.435 seconds, Fetched: 3 row(s)
3.測試:
Hive加載數據時,如果加進來的數據與表定義的分隔符、類型不同,就會變成空值。 除此之外,存到HDFS后文建會默認按照字典順序排序(ASCII碼從小到大),讀取的時候也是按照這個順序。 |
下面再向student1目錄下加些分隔方式、類型不匹配的數據
1)分隔方式不匹配:
[root@bigdata111 hiveTest]# vi a
內容為:
1005 zhaoli(空格分隔的)
1006 qianqi
1007 sisi(tab鍵分隔的)
1008 hihi
加載:
hive (default)> load data local inpath '/opt/module/hiveTest/a' into table student1;
2)數據類型不匹配:
[root@bigdata111 hiveTest]# vi w
內容為:
kkk soso(第一個數據類型不是規定的int,tab鍵分隔的)
1009 1212
加載:
hive (default)> load data local inpath '/opt/module/hiveTest/w' into table student1;
3)對於上面的Web頁面可以發現文件順序是按照字典順序進行排序的。
從select語句的結果可以看出:從HDFS里讀取數據也是按照這個文件先后順序讀的。
4.可能遇到的問題
再打開一個客戶端窗口啟動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;