Hadoop實戰:Hive操作使用
資料準備,先在HDFS上準備文字檔案,逗號分割,並上傳到/test目錄,然後在Hive裡建立表,表名和檔名要相同。
$ cat /tmp/table_test.csv 1,user1,1000 2,user2,2000 3,user3,3000 4,user4,4000 5,user5,5000
hive> CREATE TABLE table_test ( id int, name string, value INT ) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' ;
前半部分跟我們使用SQL語法差不多,後面的設定表示我們以’,’為分隔符匯入資料。
$ hive -e 'load data local inpath '/tmp/table_test.csv' into table db_test.table_test' Loading data to table db_test.table_test OK Time taken: 0.148 seconds
同一個檔案可以多次載入(追加資料),同時會在HDFS資料目錄下多生成一個檔案。另外這裡載入資料local關鍵字表示我們從本地檔案載入,如果不加local表示從HDFS中載入資料。
hive> select * from table_test; OK 1 user1 1000 2 user2 2000 3 user3 3000 4 user4 4000 5 user5 5000 Time taken: 0.058 seconds, Fetched: 5 row(s)
你也可以使用select id from table_test,但是注意在Hive中除了select * from table之外可以使用全表掃描之外,其餘任何查詢都需要走MapRedure。
[hadoop@hadoop-nn ~]$ hdfs dfs -ls /user/hive/warehouse/db_test.db/table_test/ Found 1 items -rwxrwxrwx 2 root supergroup 65 2017-06-15 22:27 /user/hive/warehouse/db_test.db/table_test/table_test.csv
注意檔案許可權屬主為root,這是因為我是在root使用者下進入hive的,一般在Hadoop使用者下進入hive命令列進行建立表。
[hadoop@hadoop-nn ~]$ hdfs dfs -mkdir /test [hadoop@hadoop-nn ~]$ hdfs dfs -put /tmp/table_test.csv /test/table_test.csv
[hadoop@hadoop-nn ~]$ hive hive> CREATE TABLE hdfs_table ( id int, name string, value INT ) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' ;
hive> LOAD DATA INPATH '/test/table_test.csv' OVERWRITE INTO TABLE db_test.hdfs_table; Loading data to table db_test.hdfs_table OK Time taken: 0.343 seconds
hive> select * from db_test.hdfs_table; OK 1 user1 1000 2 user2 2000 3 user3 3000 4 user4 4000 5 user5 5000 Time taken: 0.757 seconds, Fetched: 5 row(s)
注意,如果從HDFS載入資料到Hive後,原有的HDFS的資料檔案就不會存在了。
[hadoop@hadoop-nn ~]$ hdfs dfs -ls /test/table_test.csv ls: `/test/table_test.csv': No such file or directory
[hadoop@hadoop-nn ~]$ hdfs dfs -ls /user/hive/warehouse/db_test.db/hdfs_table/ Found 1 items -rwxrwxrwx 2 hadoop supergroup 65 2017-06-15 22:54 /user/hive/warehouse/db_test.db/hdfs_table/table_test.csv
再次上傳一個檔案到對應表的目錄(/user/hive/warehouse/db_test.db/hdfs_table)下
[hadoop@hadoop-nn ~]$ cat /tmp/table_test.csv 6,user6,6000 [hadoop@hadoop-nn ~]$ hdfs dfs -put /tmp/table_test.csv /user/hive/warehouse/db_test.db/hdfs_table/table_test_20170616.csv
hive> select * from db_test.hdfs_table; OK 1 user1 1000 2 user2 2000 3 user3 3000 4 user4 4000 5 user5 5000 6 user6 6000 Time taken: 0.053 seconds, Fetched: 6 row(s)
可以看到,我們追加的一個表資訊也顯示出來了。
建立分割槽表時,需要給定一個分割槽欄位,這個分割槽欄位可以是已經存在的,也可以是不存在(如果不存在建立表時會自動新增)。Hive分割槽概念跟MySQL分割槽差不多。下面建立一個以月為分割槽的分割槽表。
CREATE TABLE par_table ( id int, name string, value INT ) partitioned by (day int) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',';
hive> desc par_table; OK id int name string value int day int # Partition Information # col_name data_type comment day int Time taken: 0.023 seconds, Fetched: 9 row(s)
hive> LOAD DATA LOCAL INPATH '/tmp/table_test.csv' OVERWRITE INTO TABLE db_test.par_table PARTITION (day='22'); Loading data to table db_test.par_table partition (day=22) OK Time taken: 0.267 seconds hive> LOAD DATA LOCAL INPATH '/tmp/table_test.csv' OVERWRITE INTO TABLE db_test.par_table PARTITION (day='23'); Loading data to table db_test.par_table partition (day=23) OK Time taken: 0.216 seconds
[hadoop@hadoop-nn ~]$ hdfs dfs -ls /user/hive/warehouse/db_test.db/par_table/ Found 1 items drwxrwxrwx - hadoop supergroup 0 2017-06-16 01:12 /user/hive/warehouse/db_test.db/par_table/day=22 drwxrwxrwx - hadoop supergroup 0 2017-06-16 01:12 /user/hive/warehouse/db_test.db/par_table/day=23
可以看到多了對應的分割槽目錄了。
查詢資料,查詢時有點不太一樣,如果給定一個where條件指定分割槽欄位(也就是根據查詢欄位來進行分割槽),這樣就只會查詢這個分割槽的內容,不需要載入所有表。如果查詢欄位不是分割槽欄位,那麼就需要掃描所有的分割槽了。如下兩個示例:
hive> select * from db_test.par_table; OK 6 user6 6000 22 6 user6 6000 23 Time taken: 0.054 seconds, Fetched: 2 row(s) hive> select * from db_test.par_table where day=22; OK 6 user6 6000 22 Time taken: 0.068 seconds, Fetched: 1 row(s)
Hive支援外部表,外部表跟內部表和分割槽表不同。只需要在HDFS中有了對應的檔案,然後在Hive就可以建立一個表並指定對應的目錄就可以直接查資料了,而不需要執行資料載入任務。下面來測試看看:
先在HDFS中建立目錄和上傳檔案:
[hadoop@hadoop-nn ~]$ hdfs dfs -mkdir -p /hive/external [hadoop@hadoop-nn ~]$ hdfs dfs -put /tmp/table_test.csv /hive/external/ext_table.csv
然後在Hive中直接建立表:
CREATE EXTERNAL TABLE ext_table ( id int, name string, value INT ) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' LOCATION '/hive/external';
此時,直接查詢此表,不需要載入資料了
hive> select * from ext_table; OK 6 user6 6000 Time taken: 0.042 seconds, Fetched: 1 row(s)
Hive還支援桶表,這裡就不說了,很少用,有興趣自行檢視資料。
最後來一個MapReduce處理Hive的過程
hive> select count(*) from table_test; WARNING: 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. Query ID = hadoop_20170616021047_9c0dc1bf-383f-49ad-83e2-e2e5dfdcb20c Total jobs = 1 Launching Job 1 out of 1 Number of reduce tasks determined at compile time: 1 In order to change the average load for a reducer (in bytes): set hive.exec.reducers.bytes.per.reducer=In order to limit the maximum number of reducers: set hive.exec.reducers.max=In order to set a constant number of reducers: set mapreduce.job.reduces=Starting Job = job_1497424827481_0004, Tracking URL = Kill Command = /usr/local/hadoop/bin/hadoop job -kill job_1497424827481_0004 Hadoop job information for Stage-1: number of mappers: 1; number of reducers: 1 2017-06-16 02:10:52,914 Stage-1 map = 0%, reduce = 0% 2017-06-16 02:10:57,062 Stage-1 map = 100%, reduce = 0%, Cumulative CPU 1.11 sec 2017-06-16 02:11:02,204 Stage-1 map = 100%, reduce = 100%, Cumulative CPU 2.53 sec MapReduce Total cumulative CPU time: 2 seconds 530 msec Ended Job = job_1497424827481_0004 MapReduce Jobs Launched: Stage-Stage-1: Map: 1 Reduce: 1 Cumulative CPU: 2.53 sec HDFS Read: 7980 HDFS Write: 102 SUCCESS Total MapReduce CPU Time Spent: 2 seconds 530 msec OK 10 Time taken: 15.254 seconds, Fetched: 1 row(s)
可以好好看一下處理過程,由於是測試環境所以MP時間很久。
另外Hive也支援檢視,使用非常簡單,如下配置:
hive> create view view_test as select * from table_test; OK Time taken: 0.054 seconds hive> select * from view_test; OK d1 user1 1000 d1 user2 2000 d1 user3 3000 d2 user4 4000 d2 user5 5000 Time taken: 0.057 seconds, Fetched: 5 row(s)
然後我們來檢視一下Hive後設資料表資訊,在MySQL的hive庫下的DBS表中儲存Hive建立的庫資訊:
mysql> select * from DBS; +-------+-----------------------+---------------------------------------------------+---------+------------+------------+ | DB_ID | DESC | DB_LOCATION_URI | NAME | OWNER_NAME | OWNER_TYPE | +-------+-----------------------+---------------------------------------------------+---------+------------+------------+ | 1 | Default Hive database | hdfs://master:8020/user/hive/warehouse | default | public | ROLE | | 6 | NULL | hdfs://master:8020/user/hive/warehouse/db_test.db | db_test | hadoop | USER | +-------+-----------------------+---------------------------------------------------+---------+------------+------------+ 2 rows in set (0.00 sec) DB_ID:庫ID,具有唯一性。 DESC:庫描述資訊。 DB_LOCATION_URI:庫在HDFS的URI地址。 NAME:庫名稱。 OWNER_NAME:庫的所有者,用什麼系統使用者登入Hive建立的,其所有者就是誰,一般要在Hadoop使用者下登入Hive。 OWNER_TYPE:庫的所有者型別。 在hive庫下的TBLS表中儲存我們建立的表的後設資料資訊:
mysql> select * from TBLS; +--------+-------------+-------+------------------+--------+-----------+-------+------------+----------------+--------------------+--------------------+ | TBL_ID | CREATE_TIME | DB_ID | LAST_ACCESS_TIME | OWNER | RETENTION | SD_ID | TBL_NAME | TBL_TYPE | VIEW_EXPANDED_TEXT | VIEW_ORIGINAL_TEXT | +--------+-------------+-------+------------------+--------+-----------+-------+------------+----------------+--------------------+--------------------+ | 11 | 1497579800 | 6 | 0 | root | 0 | 11 | table_test | MANAGED_TABLE | NULL | NULL | | 16 | 1497581548 | 6 | 0 | hadoop | 0 | 16 | hdfs_table | MANAGED_TABLE | NULL | NULL | | 26 | 1497584489 | 6 | 0 | hadoop | 0 | 26 | par_table | MANAGED_TABLE | NULL | NULL | | 28 | 1497591914 | 6 | 0 | hadoop | 0 | 31 | ext_table | EXTERNAL_TABLE | NULL | NULL | +--------+-------------+-------+------------------+--------+-----------+-------+------------+----------------+--------------------+--------------------+ 4 rows in set (0.00 sec) 解釋幾個重要引數: TBL_ID:表ID,具有唯一性。 CREATE_TIME:表建立時間。 DB_ID:所屬庫的ID。 LAST_ACCESS_TIME:最後一次訪問時間。 OWNER:表的所有者,用什麼系統使用者登入Hive建立的,其所有者就是誰,一般要在Hadoop使用者下登入Hive。 TBL_NAME:表名稱。 TBL_TYPE:表型別,MANAGED_TABLE表示受託管的表(如內部表、分割槽表、桶表),EXTERNAL_TABLE表示外部表,兩個有個很大的區別就是受託管的表,當你執行DROP TABLE動作時,會把Hive後設資料資訊連同HDFS資料也一同刪除。而外部表執行DROP TABLE時不會刪除HDFS的資料,只是把後設資料資訊刪除了。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31559985/viewspace-2554518/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Hadoop大資料實戰系列文章之HiveHadoop大資料Hive
- 從零自學Hadoop(15):Hive表操作HadoopHive
- hadoop之旅8-centerOS7 : Hive的基本操作HadoopROSHive
- Hive調優實戰Hive
- Hive配置與操作實踐Hive
- Hadoop實戰Hadoop
- flink實戰--讀寫Hive(Flink on Hive)Hive
- hadoop 實現HIVE和HBASE協作!HadoopHive
- Hive之 hive與hadoop的聯絡HiveHadoop
- 使用Hadoop+Hbase+Hive+SpringBatch實現資料倉儲HadoopHiveSpringBAT
- Hadoop Hive介紹HadoopHive
- Hadoop2.7實戰v1.0之Hive-2.0.0+MySQL本地模式安裝HadoopHiveMySql模式
- Hadoop2.7實戰v1.0之Hive-2.0.0+MySQL遠端模式安裝HadoopHiveMySql模式
- Hive使用Calcite CBO優化流程及SQL優化實戰Hive優化SQL
- [Hadoop]Hive r0.9.0中文文件(四)之Hive變數的使用HadoopHive變數
- 【Hadoop】pyhton連結hiveHadoopHive
- Hive 常用操作Hive
- Hive基本操作Hive
- 使用java操作ranger,hdfs ranger授權操作,hive ranger授權操作JavaRangerHive
- Hadoop Hive遷移至MaxComputeHadoopHive
- Hadoop+hive環境搭建HadoopHive
- Linux&&Hadoop2.x下編譯hive1.1.0-cdh5.7.0與配置安裝實戰LinuxHadoop編譯HiveH5
- Hadoop實戰-中高階部分 之 Hadoop 管理Hadoop
- hadoop實戰1--部署Hadoop
- 《Hadoop實戰》封面解讀Hadoop
- Hadoop2.7實戰v1.0之Eclipse+Hive2.0.0的JDBC案例(最詳細搭建)HadoopEclipseHiveJDBC
- Hive高階操作-查詢操作Hive
- Hadoop實戰-中高階部分 之 Hadoop RPCHadoopRPC
- [Hadoop]Hive r0.9.0中文文件(一)之資料操作語句HadoopHive
- hadoop 用MR實現join操作Hadoop
- Hadoop(五)C#連線HiveHadoopC#Hive
- Hive實戰—時間滑動視窗計算Hive
- Flink實戰之寫Hive效能問題Hive
- 高可用Hadoop平臺-實戰Hadoop
- Hive表的基本操作Hive
- hive02_SQL操作HiveSQL
- 通過ES-Hadoop實現Hive讀寫Elasticsearch資料HadoopHiveElasticsearch
- git操作實戰指南Git