1、概述
要理解Hive中的表,要回溯到Hive的性质。
Hive实质是转换器,接收用户输入的类SQL语句,转换成MapReduce作业,类似rdbms的引擎。
根本内容还是HDFS和MapReduce作业。
所以:
- 表是对HDFS目录的映射,特别类似Oracle的外部表
- 表的创建是在HDFS上创建目录,并在元数据里添加了映射
- 表数据加载、导出就是目录文件的移入、移除。
2、内部表
create table stu (sno int ,sname string ,sex string,sage int,sdept string)
row format delimited fields terminated by ',';
建表:说明表字段和数据类型,指明字段与文件列的映射。
ps:在hdfs上创建同名目录,表对应目录。
2.1 加载数据
load data local inpath 'F:\hadoop-test\test_data.csv' into table stu;
ps:加载数据实质是上传文件到表对应的HDFS目录。
相应的,把文件复制一份,就相当于insert到表了。
3、外部表
create table testtab_ext (testid string,barno int,result string,testtime int )
row format delimited fields terminated by ','
location 'hdfs://local:9000/hiveExternal';
ps:外部表是对应到目录的,该目录下所有符合格式要求的文件都对应表内数据。
外部表的好处是,只用元数据映射,删除时仅删除元数据。方便多个应用共用数据,如pig等。
4、分区表
create table testtab_part (testid string,barno string,result string,testtime string )
partitioned by (mon STRING,factory STRING)
row format delimited fields terminated by ',' ;
ps:注意partitioned的顺序在row format前,否则报错。
另,分区字段可以不包含在表字段里。
4.1 分区表加载数据
load data local inpath 'F:\hadoop-test\test_data.csv' into table testtab_part
partition(mon='201908',factory='xian');
ps:实质是在表目录下建了子目录。
>hadoop fs -ls /user/hive/warehouse/testdb.db/testtab_part/
Found 1 items
drwxrwxr-x - 10171512 supergroup 0 2019-08-23 10:59 /user/hive/warehouse/testdb.db/testtab_part/mon=201908
5、查看表的相关信息
desc extended testtab_part;
ps:加extended关键字,会包含对应的hdfs位置、是否压缩等。
6、导出数据
insert overwrite local directory 'file:///f:\hadoop-test\hiveOutput'
select * from testtab_part;
可重新指定列分割符
insert overwrite local directory 'file:///f:\hadoop-test\hiveOutput'
row format delimited fields terminated by ','
select * from testtab_part;
ps:导出的mr作业的结果,文件数与启动的reduce任务数一致。看文件名,也是reduce的输出名称。
7、问题整理
1、Retrying connect to server: account.jetbrains.com/0.0.0.0:8032?
&:默认情况下yarn ResourceManager 相关服务IP地址指向的是0.0.0.0。
同时本机在hosts文件中,定义了0.0.0.0的同义词指向account.jetbrains.com,顾总是连接这个地址。
但是我在core-site.xml中定义了yarn.resourcemanager.address参数值了,但是没有生效。
把该参数移动到yarn-site.xml中,重启hadoop,配置的参数生效。
2、查看hadoop的配置参数?
&:hdfs getconf -confkey yarn.resourcemanager.address
3、hadoop 遇到java.net.ConnectException: to 0.0.0.0:10020 failed on connection
&:这个问题一般是在hadoop2.x版本里会出现,hadoop的datanode需要访问namenode的jobhistory server,如果没有修改,则默认为0.0.0.0:10020,则可以修改mapred-site.xml文件:
mapreduce.jobhistory.address
需要启动单独的服务,存放mr任务的历史记录。