hive 语句中有;报错_Hive基础之外部表

在hive创建表的语法中有一个关键字是EXTERNAL,该关键字表示表的类型,在hive中一共有两种类型的表:管理表和托管表(外部表)。如果没有加EXTERNAL关键字,则创建表都是管理表。

1.管理表信息

如何查看一张表是管理表还是托管表呢?可以使用desc命令:

hive (default)> desc formatted dept;
OK
col_name        data_type       comment
# col_name              data_type               comment             

deptno                  int                                         
dname                   string                                      
loc                     string                                      

# Detailed Table Information             
Database:               default                  
Owner:                  hive                     
CreateTime:             Wed Feb 13 21:06:45 CST 2019     
LastAccessTime:         UNKNOWN                  
Protect Mode:           None                     
Retention:              0                        
Location:               hdfs://node1:8020/user/hive/warehouse/dept       
Table Type:             MANAGED_TABLE            
Table Parameters:                
        COLUMN_STATS_ACCURATE   true                
        numFiles                1                   
        totalSize               82                  
        transient_lastDdlTime   1550063999          

# Storage Information            
SerDe Library:          org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe      
InputFormat:            org.apache.hadoop.mapred.TextInputFormat         
OutputFormat:           org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat       
Compressed:             No                       
Num Buckets:            -1                       
Bucket Columns:         []                       
Sort Columns:           []                       
Storage Desc Params:             
        field.delim             t                  
        serialization.format    t                  
Time taken: 0.454 seconds, Fetched: 32 row(s)

其他的信息暂且不看,其中有一行信息是Table Type: MANAGED_TABLE,这个就是指示表的类型的,可以看出这张表是管理表。

2.外部表

下面我们创建一张外部表,创建外部表只需在原有的建表语句上增加EXTERNAL关键字。

hive (default)> create EXTERNAL table IF NOT EXISTS default.emp_ext(
              > empno int,
              > ename string,
              > job string,
              > mgr int,
              > hiredate string,
              > sal double,
              > comm double,
              > deptno int
              > )
              > ROW FORMAT DELIMITED FIELDS TERMINATED BY 't'
              > ;
OK
Time taken: 0.208 seconds
hive (default)> show tables;
OK
tab_name
dept
dept_cats
emp
emp_ext
Time taken: 0.073 seconds, Fetched: 4 row(s)

可以看到外部表emp_ext已经创建成功了,我们看一下该表的详细描述信息:

hive (default)> desc formatted emp_ext;
OK
col_name        data_type       comment
# col_name              data_type               comment             

empno                   int                                         
ename                   string                                      
job                     string                                      
mgr                     int                                         
hiredate                string                                      
sal                     double                                      
comm                    double                                      
deptno                  int                                         

# Detailed Table Information             
Database:               default                  
Owner:                  hive                     
CreateTime:             Wed Feb 13 21:54:25 CST 2019     
LastAccessTime:         UNKNOWN                  
Protect Mode:           None                     
Retention:              0                        
Location:               hdfs://node1:8020/user/hive/warehouse/emp_ext    
Table Type:             EXTERNAL_TABLE           
Table Parameters:                
        EXTERNAL                TRUE                
        transient_lastDdlTime   1550066065          

# Storage Information            
SerDe Library:          org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe      
InputFormat:            org.apache.hadoop.mapred.TextInputFormat         
OutputFormat:           org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat       
Compressed:             No                       
Num Buckets:            -1                       
Bucket Columns:         []                       
Sort Columns:           []                       
Storage Desc Params:             
        field.delim             t                  
        serialization.format    t                  
Time taken: 0.076 seconds, Fetched: 35 row(s)

可以看到该表的表类型描述为Table Type: EXTERNAL_TABLE,表明该表是一张外部表。

3.管理表与外部表的区别

那么外部表和管理表最大的区别在哪呢?对于大公司网站的日志,一般会有专门的部门来进行日志处理,处理完后会将日志保存到hdfs中,比如保存的路径如下:
/hdfs/sitelog ​
20190212.txt
​ 20190213.txt
​ 20190214.txt
现在有两个业务部门:数据挖掘和机器学习,他们都需要对这个日志进行分析,如果以管理表的方式存储在hive中,那么hdfs上的文件路径会如下:
/user/dept1/hive
​ 20190212.txt
​ 20190213.txt
​ 20190214.txt
/user/dept2/hive
​ 20190212.txt
​ 20190213.txt
​ 20190214.txt
这样本来在hdfs上每个文件保存有三份,如果使用管理表,那么每个文件将会保存9份,对存储空间造成极大的浪费。这个时候就需要使用外部表的特性,外部表在创建表的时候可以指定数据文件的路径,比如/hdfs/sitelog,后面如果不需要使用该表的时候可以删除该表,但是不会删除数据。而管理表在删除表的时候会将数据一起进行删除。

管理表与外部表的区别如下:

cb4929e8f56f5343e0bada67497d9348.png

4.创建外部表

我们通过指定hdfs路径的方式创建外部表,然后不通过load的方式加载数据。

hive (default)> create EXTERNAL table IF NOT EXISTS default.emp_ext2(
              > empno int,
              > ename string,
              > job string,
              > mgr int,
              > hiredate string,
              > sal double,
              > comm double,
              > deptno int
              > )
              > ROW FORMAT DELIMITED FIELDS TERMINATED BY 't'
              > location '/user/hive/user1/warehouse/emp_ext2';
OK
Time taken: 0.428 seconds

location中指定的目录不存在也没有关系,但是上级目录一定要有访问权限,否则会报错。下面创建目录并将数据放入目录中:

hive (default)> dfs -mkdir -p /user/hive/user1/warehouse/emp_ext2;
hive (default)> dfs -put /opt/datas/emp.txt /user/hive/user1/warehouse/emp_ext2; 
hive (default)> dfs -ls /user/hive/user1/warehouse/emp_ext2;
Found 1 items
-rw-r--r--   3 hive hive        659 2019-02-13 23:12 /user/hive/user1/warehouse/emp_ext2/emp.txt

然后我们查询一下该表:

hive (default)> select * from emp_ext2;
OK
empno   ename   job     mgr     hiredate        sal     comm    deptno
7369    SMITH   CLERK   7902    1980-12-17      800.0   NULL    20
7499    ALLEN   SALESMAN        7698    1981-2-20       1600.0  300.0   30
7521    WARD    SALESMAN        7698    1981-2-22       1250.0  500.0   30
7566    JONES   MANAGER 7839    1981-4-2        2975.0  NULL    20
7654    MARTIN  SALESMAN        7698    1981-9-28       1250.0  1400.0  30
7698    BLAKE   MANAGER 7839    1981-5-1        2850.0  NULL    30
7782    CLARK   MANAGER 7839    1981-6-9        2450.0  NULL    10
7788    SCOTT   ANALYST 7566    1987-4-19       3000.0  NULL    20
7839    KING    PRESIDENT       NULL    1981-11-17      5000.0  NULL    10
7844    TURNER  SALESMAN        7698    1981-9-8        1500.0  0.0     30
7876    ADAMS   CLERK   7788    1987-5-23       1100.0  NULL    20
7900    JAMES   CLERK   7698    1981-12-3       950.0   NULL    30
7902    FORD    ANALYST 7566    1981-12-3       3000.0  NULL    20
7934    MILLER  CLERK   7782    1982-1-23       1300.0  NULL    10
Time taken: 0.96 seconds, Fetched: 14 row(s)

可以看到数据已经加载进来,但是我们并没有进行load数据,所以对于外部表只要将数据文件放到对应的目录下,该外部表就可以正常访问,这也是企业中常用的做法。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值