这篇文章主要介绍“Hive的基本使用方法有哪些”,在日常操作中,相信很多人在Hive的基本使用方法有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Hive的基本使用方法有哪些”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

Hive表类型测试内部表

数据准备,先在HDFS上准备文本文件,逗号分割,并上传到/test目录,然后在Hive里创建表,表名和文件名要相同。

$cat/tmp/table_test.csv1,user1,10002,user2,20003,user3,30004,user4,40005,user5,5000Hive创建表

hive>CREATETABLEtable_test(idint,namestring,valueINT)ROWFORMATDELIMITEDFIELDSTERMINATEDBY',';

前半部分跟我们使用SQL语法差不多,后面的设置表示我们以’,’为分隔符导入数据。

Hive加载HDFS数据

$hive-e'loaddatalocalinpath'/tmp/table_test.csv'intotabledb_test.table_test'Loadingdatatotabledb_test.table_testOKTimetaken:0.148seconds

同一个文件可以多次加载(追加数据),同时会在HDFS数据目录下多生成一个文件。另外这里加载数据local关键字表示我们从本地文件加载,如果不加local表示从HDFS中加载数据。

Hive查看数据

hive>select*fromtable_test;OK1user110002user220003user330004user440005user55000Timetaken:0.058seconds,Fetched:5row(s)

你也可以使用select id from table_test,但是注意在Hive中除了select * from table之外可以使用全表扫描之外,其余任何查询都需要走MapRedure。

查看HDFS数据文件

[hadoop@hadoop-nn~]$hdfsdfs-ls/user/hive/warehouse/db_test.db/table_test/Found1items-rwxrwxrwx2rootsupergroup652017-06-1522:27/user/hive/warehouse/db_test.db/table_test/table_test.csv

注意文件权限属主为root,这是因为我是在root用户下进入hive的,一般在Hadoop用户下进入hive命令行进行创建表。

从HDFS加载数据到Hive,先上传数据到HDFS集群中

[hadoop@hadoop-nn~]$hdfsdfs-mkdir/test[hadoop@hadoop-nn~]$hdfsdfs-put/tmp/table_test.csv/test/table_test.csv创建表

[hadoop@hadoop-nn~]$hivehive>CREATETABLEhdfs_table(idint,namestring,valueINT)ROWFORMATDELIMITEDFIELDSTERMINATEDBY',';加载数据

hive>LOADDATAINPATH'/test/table_test.csv'OVERWRITEINTOTABLEdb_test.hdfs_table;Loadingdatatotabledb_test.hdfs_tableOKTimetaken:0.343secondshive>select*fromdb_test.hdfs_table;OK1user110002user220003user330004user440005user55000Timetaken:0.757seconds,Fetched:5row(s)

注意,如果从HDFS加载数据到Hive后,原有的HDFS的数据文件就不会存在了。

[hadoop@hadoop-nn~]$hdfsdfs-ls/test/table_test.csvls:`/test/table_test.csv':Nosuchfileordirectory查看HDFS数据文件

[hadoop@hadoop-nn~]$hdfsdfs-ls/user/hive/warehouse/db_test.db/hdfs_table/Found1items-rwxrwxrwx2hadoopsupergroup652017-06-1522: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.csv6,user6,6000[hadoop@hadoop-nn~]$hdfsdfs-put/tmp/table_test.csv/user/hive/warehouse/db_test.db/hdfs_table/table_test_20170616.csv再次查看Hive表

hive>select*fromdb_test.hdfs_table;OK1user110002user220003user330004user440005user550006user66000Timetaken:0.053seconds,Fetched:6row(s)

可以看到,我们追加的一个表信息也显示出来了。

分区表

创建分区表时,需要给定一个分区字段,这个分区字段可以是已经存在的,也可以是不存在(如果不存在创建表时会自动添加)。Hive分区概念跟MySQL分区差不多。下面创建一个以月为分区的分区表。

CREATETABLEpar_table(idint,namestring,valueINT)partitionedby(dayint)ROWFORMATDELIMITEDFIELDSTERMINATEDBY',';查看表信息

hive>descpar_table;OKidintnamestringvalueintdayint#PartitionInformation#col_namedata_typecommentdayintTimetaken:0.023seconds,Fetched:9row(s)加载数据到Hive分区表中,需要指定对应的分区表进行数据加载

hive>LOADDATALOCALINPATH'/tmp/table_test.csv'OVERWRITEINTOTABLEdb_test.par_tablePARTITION(day='22');Loadingdatatotabledb_test.par_tablepartition(day=22)OKTimetaken:0.267secondshive>LOADDATALOCALINPATH'/tmp/table_test.csv'OVERWRITEINTOTABLEdb_test.par_tablePARTITION(day='23');Loadingdatatotabledb_test.par_tablepartition(day=23)OKTimetaken:0.216seconds查看HDFS数据文件展示样式

[hadoop@hadoop-nn~]$hdfsdfs-ls/user/hive/warehouse/db_test.db/par_table/Found1itemsdrwxrwxrwx-hadoopsupergroup02017-06-1601:12/user/hive/warehouse/db_test.db/par_table/day=22drwxrwxrwx-hadoopsupergroup02017-06-1601:12/user/hive/warehouse/db_test.db/par_table/day=23

可以看到多了对应的分区目录了。

查询数据,查询时有点不太一样,如果给定一个where条件指定分区字段(也就是根据查询字段来进行分区),这样就只会查询这个分区的内容,不需要加载所有表。如果查询字段不是分区字段,那么就需要扫描所有的分区了。如下两个示例:

hive>select*fromdb_test.par_table;OK6user66000226user6600023Timetaken:0.054seconds,Fetched:2row(s)hive>select*fromdb_test.par_tablewhereday=22;OK6user6600022Timetaken:0.068seconds,Fetched:1row(s)外部表

Hive支持外部表,外部表跟内部表和分区表不同。只需要在HDFS中有了对应的文件,然后在Hive就可以创建一个表并指定对应的目录就可以直接查数据了,而不需要执行数据加载任务。下面来测试看看:

先在HDFS中创建目录和上传文件:

[hadoop@hadoop-nn~]$hdfsdfs-mkdir-p/hive/external[hadoop@hadoop-nn~]$hdfsdfs-put/tmp/table_test.csv/hive/external/ext_table.csv

然后在Hive中直接创建表:

CREATEEXTERNALTABLEext_table(idint,namestring,valueINT)ROWFORMATDELIMITEDFIELDSTERMINATEDBY','LOCATION'/hive/external';

此时,直接查询此表,不需要加载数据了

hive>select*fromext_table;OK6user66000Timetaken:0.042seconds,Fetched:1row(s)

Hive还支持桶表,这里就不说了,很少用,有兴趣自行查看资料。

最后来一个MapReduce处理Hive的过程

hive>selectcount(*)fromtable_test;WARNING:Hive-on-MRisdeprecatedinHive2andmaynotbeavailableinthefutureversions.Considerusingadifferentexecutionengine(i.e.spark,tez)orusingHive1.Xreleases.QueryID=hadoop_20170616021047_9c0dc1bf-383f-49ad-83e2-e2e5dfdcb20cTotaljobs=1LaunchingJob1outof1Numberofreducetasksdeterminedatcompiletime:1Inordertochangetheaverageloadforareducer(inbytes):sethive.exec.reducers.bytes.per.reducer=Inordertolimitthemaximumnumberofreducers:sethive.exec.reducers.max=Inordertosetaconstantnumberofreducers:setmapreduce.job.reduces=StartingJob=job_1497424827481_0004,TrackingURL=http://master:8088/proxy/application_1497424827481_0004/KillCommand=/usr/local/hadoop/bin/hadoopjob-killjob_1497424827481_0004HadoopjobinformationforStage-1:numberofmappers:1;numberofreducers:12017-06-1602:10:52,914Stage-1map=0%,reduce=0%2017-06-1602:10:57,062Stage-1map=100%,reduce=0%,CumulativeCPU1.11sec2017-06-1602:11:02,204Stage-1map=100%,reduce=100%,CumulativeCPU2.53secMapReduceTotalcumulativeCPUtime:2seconds530msecEndedJob=job_1497424827481_0004MapReduceJobsLaunched:Stage-Stage-1:Map:1Reduce:1CumulativeCPU:2.53secHDFSRead:7980HDFSWrite:102SUCCESSTotalMapReduceCPUTimeSpent:2seconds530msecOK10Timetaken:15.254seconds,Fetched:1row(s)

可以好好看一下处理过程,由于是测试环境所以MP时间很久。

视图

另外Hive也支持视图,使用非常简单,如下配置:

hive>createviewview_testasselect*fromtable_test;OKTimetaken:0.054secondshive>select*fromview_test;OKd1user11000d1user22000d1user33000d2user44000d2user55000Timetaken:0.057seconds,Fetched:5row(s)Hive元数据信息

然后我们来查看一下Hive元数据表信息,在MySQL的hive库下的DBS表中存储Hive创建的库信息:

mysql>select*fromDBS;+-------+-----------------------+---------------------------------------------------+---------+------------+------------+|DB_ID|DESC|DB_LOCATION_URI|NAME|OWNER_NAME|OWNER_TYPE|+-------+-----------------------+---------------------------------------------------+---------+------------+------------+|1|DefaultHivedatabase|hdfs://master:8020/user/hive/warehouse|default|public|ROLE||6|NULL|hdfs://master:8020/user/hive/warehouse/db_test.db|db_test|hadoop|USER|+-------+-----------------------+---------------------------------------------------+---------+------------+------------+2rowsinset(0.00sec)DB_ID:库ID,具有唯一性。DESC:库描述信息。DB_LOCATION_URI:库在HDFS的URI地址。NAME:库名称。OWNER_NAME:库的所有者,用什么系统用户登录Hive创建的,其所有者就是谁,一般要在Hadoop用户下登录Hive。OWNER_TYPE:库的所有者类型。在hive库下的TBLS表中存储我们创建的表的元数据信息:mysql>select*fromTBLS;+--------+-------------+-------+------------------+--------+-----------+-------+------------+----------------+--------------------+--------------------+|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|+--------+-------------+-------+------------------+--------+-----------+-------+------------+----------------+--------------------+--------------------+4rowsinset(0.00sec)解释几个重要参数:TBL_ID:表ID,具有唯一性。CREATE_TIME:表创建时间。DB_ID:所属库的ID。LAST_ACCESS_TIME:最后一次访问时间。OWNER:表的所有者,用什么系统用户登录Hive创建的,其所有者就是谁,一般要在Hadoop用户下登录Hive。TBL_NAME:表名称。TBL_TYPE:表类型,MANAGED_TABLE表示受托管的表(如内部表、分区表、桶表),EXTERNAL_TABLE表示外部表,两个有个很大的区别就是受托管的表,当你执行DROPTABLE动作时,会把Hive元数据信息连同HDFS数据也一同删除。而外部表执行DROPTABLE时不会删除HDFS的数据,只是把元数据信息删除了。

到此,关于“Hive的基本使用方法有哪些”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注亿速云网站,小编会继续努力为大家带来更多实用的文章!