zoukankan      html  css  js  c++  java
  • 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.如果外部表被错误删除,则需要重新建表,及重新创建分区与数据的映射关系。

  • 相关阅读:
    Unable to start adb server: adb server version (32) doesn't match this client (39); killing...
    mysql错误指令:Failed to open file "file_name" error 2/error 22
    爬虫流程概述
    Jupyter Notebook的使用
    markdown语法
    pymysql向表中插入数据
    python创建mysql数据库中的表
    python查询ip地址来源
    Pandas读取csv时设置列名
    程序员面试——位运算
  • 原文地址:https://www.cnblogs.com/tangtianfly/p/2876637.html
Copyright © 2011-2022 走看看