• Hive内部表外部表转化分析


     

    hive表分为内部表和外部表。
    外部表在删除的时候并不会删除到hdfs中的文件,比较安全,所以对于重要的需要进行分析的日志建议使用外部表进行操作,这样不会出现误操作影响到日志的存储。
    内部表在阐述的时候会删除掉hdfs中的文件,所以一般用于创建临时表,这样临时表在删除后,也会删除掉hdfs中的数据。

    今天这里主要是对内部表转化为外部表进行相关的实验。

    试验一:
    建立内部表,导入数据。将内部表修改为外部表,删除该表。查看是否会删除掉hdfs中的数据。

     SQL |   复制 | ?  
    01  
    02
    //创建内部表
    03
    CREATE TABLE tmp.pvlog(ip STRING,CURRENT_DATE STRING,userinfo STRING)
    04
    partitioned BY(ptDate STRING) ROW format delimited FIELDS TERMINATED BY '\t' ;
    05
    //上传数据
    06
    LOAD DATA LOCAL INPATH '/home/user/logs/log2012-08-14.txt' INTO TABLE tmp.pvlog partition(ptdate='2012-08-14');
    07
    LOAD DATA LOCAL INPATH '/home/user/logs/log2012-08-15.txt' INTO TABLE tmp.pvlog partition(ptdate='2012-08-15');
    08
    //修改为外部表
    09
    USE tmp ;
    10
    ALTER TABLE pvlog SET TBLPROPERTIES ('EXTERNAL'='TRUE');
    11
    //查询
    12
    SELECT ptdate,COUNT(1) FROM tmp.pvlog  GROUP BY ptdate ;
    13
    能查询出数据
    14
    //删除该表
    15
    DROP TABLE pvlog ;
    16
    //查询hdfs中的数据
    17
    bin/hadoop dfs -ls /USER/hive/warehouse/tmp.db/pvlog/ptdate=*
    18
    能查询到数据。
    19
    ALTER TABLE pvlog ADD partition(ptdate='2012-08-14');
    20
    ALTER TABLE pvlog ADD partition(ptdate='2012-08-15');
    21  

    结论:hdfs中的数据不会被删除。
    试验二:
    建立内部表,将内部表修改为外部表,通过load data 导入数据。看外部表是否能通过loaddata的方式关联到hdfs。
     SQL |   复制 | ?  
    01  
    02
    //创建内部表
    03
    CREATE TABLE tmp.pvlog(ip STRING,CURRENT_DATE STRING,userinfo STRING)
    04
    partitioned BY(ptDate STRING) ROW format delimited FIELDS TERMINATED BY '\t' ;
    05
    //修改为外部表
    06
    USE tmp ;
    07
    ALTER TABLE pvlog SET TBLPROPERTIES ('EXTERNAL'='TRUE');
    08
    //上传数据
    09
    LOAD DATA LOCAL INPATH '/home/user/logs/log2012-08-14.txt' INTO TABLE tmp.pvlog partition(ptdate='2012-08-14');
    10
    LOAD DATA LOCAL INPATH '/home/user/logs/log2012-08-15.txt' INTO TABLE tmp.pvlog partition(ptdate='2012-08-15');
    11
    //
    12
    //查询
    13
    SELECT ptdate,COUNT(1) FROM tmp.pvlog  GROUP BY ptdate ;
    14
    能查询出数据
    15  

    结论:
        1.hdfs中数据可以正常导入。
        2.外部表的分区与hdfs的映射关系还是同内部表一样,可以正常建立。不用额外的执行add partition来建立连接。
        3.但是他不会重新维护在删除外部表前已经存在的mapping关系。所以在本实验中,查询分区数据信息只会出现度假的数据。

    实验三:
    创建外部表,通过hadoop的hdfs上传文件,并以hive增加分区的方式来访问数据,看是否能正常访问到数据。

     SQL |   复制 | ?  
    01  
    02
    //创建内部表
    03
    CREATE TABLE tmp.pvlog(ip STRING,CURRENT_DATE STRING,userinfo STRING)
    04
    partitioned BY(ptDate STRING) ROW format delimited FIELDS TERMINATED BY '\t' ;
    05
    //修改为外部表
    06
    USE tmp ;
    07
    ALTER TABLE pvlog SET TBLPROPERTIES ('EXTERNAL'='TRUE');
    08
    //上传数据
    09
    bin/hadoop dfs -mkdir /USER/hive/warehouse/tmp.db/pvlog/ptdate=2012-08-14
    10
    bin/hadoop dfs -mkdir /USER/hive/warehouse/tmp.db/pvlog/ptdate=2012-08-15
    11
    bin/hadoop dfs -put /home/USER/logs/pvlog2012-08-14.txt /USER/hive/warehouse/tmp.db/pvlog/ptdate=2012-08-14
    12
    bin/hadoop dfs -put /home/USER/logs/pvlog2012-08-15.txt /USER/hive/warehouse/tmp.db/pvlog/ptdate=2012-08-15
    13
    //增加分区mapping
    14
    ALTER TABLE pvlog ADD partition(ptdate='2012-08-14');
    15
    ALTER TABLE pvlog ADD partition(ptdate='2012-08-15');
    16
    继续查询
    17
    SELECT ptdate,ptchannel,COUNT(1) FROM tmp.pvlog GROUP BY ptdate,ptchannel ;
    18
    可以查询到数据
    19  

    结论:我们也可以通过hdfs上传文件,同时手动建立分区映射关系。来导入数据。

    整体结论:
        1.外部表远比内部表更加安全。而且上传数据的方式与以前相同,不需要修改以前的逻辑。
        2.如果外部表被错误删除,则需要重新建表,及重新创建分区与数据的映射关系。

  • 相关阅读:
    4 Apr 18 软件开发目录 logging模块的使用 序列化(Json, Pickle) os模块
    3 Apr 18 内置函数 列表生成式与生成器表达式 模块的使用之import 模块的使用之from…import…
    2 Apr 18 三元表达式 函数递归 匿名函数 内置函数
    30 Mar 18 迭代器 生成器 面向过程的编程
    29 Mar 18 函数 有参、无参装饰器
    28 Mar 18 函数
    27 Mar 18 函数的参数
    26 Mar 18 函数介绍
    23 Mar 18 文件处理
    22 Mar 18 补充数据类型+字符编码+文件处理
  • 原文地址:https://www.cnblogs.com/tangtianfly/p/2876637.html
Copyright © 2020-2023  润新知