• HBase数据迁移至Hive


    背景:需要将HBase中表xyz(列簇cf1,列val)迁移至Hive

    1. 建立HiveHBase的映射关系

        1.1 运行hive shell进入hive命令行模式,运行如下脚本

    CREATE EXTERNAL TABLE hbase_student(key int, value string)
    STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
    WITH SERDEPROPERTIES ("hbase.columns.mapping" = ":key,cf1:val")
    TBLPROPERTIES ("hbase.table.name" = "xyz", "hbase.mapred.output.outputtable" = "xyz");

      注意:(EXTERNAL表示HBase中已经存在了xyz表;如果HBase中不存在,则去掉EXTERNAL关键字,执行命令后,将会在HBase中创建xyz)

    1.2 Hive中查看

    hbase_student:>  show tables

      在hbase中查看xyz表:>  list

    2. 插入数据测试

       2.1 HBasexyz表插入数据,并查看:

      查看表结构:desc ‘xyz’

      Hbase表插入一条数据:put ‘xyz’,’0’,’cf1:val’,’lowi’

      查看表中的数据:scan ‘xyz’

     

      2.1.1 Hive中的hbase_table_1表查看select * from hbase_student;

     

      2.2 Hivehbase_table_1表插入数据,并查看:

      Hive表插入一条数据:insert into hbase_student values (‘1’,’lojun’);

      查看数据:select * from hbase_student;

     

      2.2.1 HBase中的xyz表查看scan xyz

     

    3.删除hive表:hive> DROP TABLE IF EXISTS hbase_student;

     

      此时hive表已经删除成功,再去查hbase’xyz’,发现也已经被删除:

     

      这个问题与hivehbase表关联的方式有关:

    1)创建hive表无EXTERNAL

    CREATE TABLE hbase_student(key int, value string)
    STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
    WITH SERDEPROPERTIES ("hbase.columns.mapping" = ":key,cf1:val")
    TBLPROPERTIES ("hbase.table.name" = "xyz", "hbase.mapred.output.outputtable" = "xyz");

     这种情况是hbase本来没有这张表。hive建表时创建了hbase表。这种情况下,hdfs的hive表目录有hive文件夹,但是里面没有数据(数据是存在hbase里面的)。

     当hive使用overwrite关键字进行插入数据时。原本数据不会被删除,有同样的行健会被更新覆盖。因为数据是存在hbase中的,遵守hbase插入数据的规则。

      1)当hive删除hive表时,hbase表也会删除。

      2)当先删除hbase的时候,先disabled table,然后drop table

     hbase表就被删除了,zookeeper里面也就删除了;

     但是hive里面还在,用show tables还能查出来,mysql中TBLS里面还有hive表的信息。但是用select * from hive 查询的时候报错表不存在(TableNotFoundException)。

     然后删除hive里面的表的时候会报错TableNotFoundException)。继续show tables时,发现表已经不在了。TBLS里面也没有hive表了。

    1EXTERNAL

    CREATE EXTERNAL TABLE hbase_student(key int, value string)
    STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
    WITH SERDEPROPERTIES ("hbase.columns.mapping" = ":key,cf1:val")
    TBLPROPERTIES ("hbase.table.name" = "xyz", "hbase.mapred.output.outputtable" = "xyz");

     这种情况是hbase里面已经有这张表了,创建一个hive表去管理这hbase表。

     当hive使用overwrite关键字进行插入数据时。跟第一种情况一样。

      1)删除hive表对hbase没有影响;

      2)但是先删除hbase表hive就会报TableNotFoundException;但是删除hive不会报上面这个错。

  • 相关阅读:
    Div在BOdy中居中
    c_lc_填充每个节点的下一个右侧节点指针 I~II(递归)
    c_pat_哈密顿回路 & 最大点集 & 是否是旅行商路径 & 欧拉路径 & 最深的根(邻接矩阵存图)
    c_lc_二叉搜索树的最近公共祖先 & 二叉树的最近公共祖先(利用性质 | 从p,q开始存储每个结点的父亲)
    c_pat_树题大杂烩(利用性质)
    现在的我,理解了这种「激情」
    b_pat_排成最小的数字 & 月饼(字符串拼接比较a+b<b+a)
    c_lc_二叉搜索树中的众数(中序遍历+延迟更新前驱结点)
    b_pat_分享 & 链表排序 & 链表去重(链表模拟)
    b_pat_弹出序列(栈模拟)
  • 原文地址:https://www.cnblogs.com/lojun/p/9703973.html
Copyright © 2020-2023  润新知