如何将 Hive 表与 HBase 表映射?

Posted

技术标签:

【中文标题】如何将 Hive 表与 HBase 表映射?【英文标题】:How can i map Hive table with HBase table? 【发布时间】:2013-08-01 06:14:37 【问题描述】:

我创建了一个 HBase 表,如下所示:

创建'nancy','cf'

并在 Hive 中创建了一个表,如下所示:

创建外部表 nancy(id int, name string)

由'org.apache.hadoop.hive.hbase.HBaseStorageHandler'存储

WITH SERDEPROPERTIES ("hbase.columns.mapping" = ":key, cf:name")

TBLPROPERTIES("hbase.table.name"="nancy");

我在映射它写吗? “hbase.columns.mapping”中的Key是什么意思?

谁能解释一下这个映射?

【问题讨论】:

【参考方案1】:

您是否遇到任何具体问题?我觉得查询没问题。

key 表示您正在使用该字段作为表键。请记住,hive 表中的每个字段都可以映射到其中一个:

表格键(使用 :key 作为选择器) 列族 (cf:)(Hive 中的 MAP 字段 列

回应您的 cmets :

hive> CREATE EXTERNAL TABLE hbase_table_2(key int, name string)

    > STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
    > WITH SERDEPROPERTIES ("hbase.columns.mapping" = ":key,cf:name")
    > TBLPROPERTIES("hbase.table.name" = "nancy");
OK
Time taken: 5.106 seconds

hive> select * from hbase_table_2;
OK
Time taken: 0.077 seconds

hive> INSERT OVERWRITE TABLE hbase_table_2 SELECT * FROM demo WHERE id=1;
Total MapReduce jobs = 1
Launching Job 1 out of 1
Number of reduce tasks is set to 0 since there's no reduce operator
Starting Job = job_201308011237_0003, Tracking URL = http://localhost:50030/jobdetails.jsp?jobid=job_201308011237_0003
Kill Command = /Users/miqbal1/hadoop-eco/hadoop-1.1.2/libexec/../bin/hadoop job  -kill job_201308011237_0003
Hadoop job information for Stage-0: number of mappers: 1; number of reducers: 0
2013-08-01 16:29:21,832 Stage-0 map = 0%,  reduce = 0%
2013-08-01 16:29:23,843 Stage-0 map = 100%,  reduce = 0%
2013-08-01 16:29:24,849 Stage-0 map = 100%,  reduce = 100%
Ended Job = job_201308011237_0003
1 Rows loaded to hbase_table_2
MapReduce Jobs Launched: 
Job 0: Map: 1   HDFS Read: 256 HDFS Write: 0 SUCCESS
Total MapReduce CPU Time Spent: 0 msec
OK
Time taken: 8.392 seconds
hive> 

这是我的 HBase 表:

hbase(main):017:0> scan 'nancy'
ROW                                      COLUMN+CELL                                                                                                          
 1                                       column=cf:name, timestamp=1375354762803, value=tariq                                                                 
1 row(s) in 0.0300 seconds

【讨论】:

现在我尝试将配置单元表映射到现有的 HBase 表。创建外部表 hbase_table_2(key int, name string) 由 'org.apache.hadoop.hive.hbase.HBaseStorageHandler' WITH SERDEPROPERTIES ("hbase.columns.mapping" = ":key,cf:name") TBLPROPERTIES("hbase .table.name" = "南希");它没有显示任何错误,但是当我执行选择 * 时,HBase 表中的数据没有显示。 哪个表?基数? hbase(main):001:0>描述'nancy'描述启用NAME =>'nancy',FAMILIES => [NAME =>'cf',BLOOM true FILTER =>'NONE',REPLICATION_SCOPE =>'0' , VERSION S => '3', COMPRESSION => 'NONE', MIN_VERSIONS => '0', TTL => '2147483647', BLOCKSIZE => '65536', IN_ME MORY => 'false', BLOCKCACHE => 'true '] 1 行在 1.0500 秒内 我复制了你的命令,它在我的机器上运行良好。请参阅编辑后的答案.. 我使用了 put 命令.. 我能够在 Hive 中创建表,但表中没有记录。 HBase表中有记录。 Put 也可以正常工作。你能通过 Hive 插入数据吗?hive.log 中有什么有趣的吗?【参考方案2】:

问题在于映射 ":key, cf:name" 的列中的空格字符。 Hive 查找名为 "cf" 而不是 "cf" 的列族。因为 Tariq 的回复 (":key,cf:name") 中没有空格,所以它可以正常工作。

【讨论】:

【参考方案3】:

您有两种选择将 hive 表映射到 hbase 表:

    创建一个 hive 和 hbase 都可以管理的表(例如删除)

    CREATE TABLE hbase_table_1(key int, name string)
    STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
    WITH SERDEPROPERTIES ("hbase.columns.mapping" = ":key,cf:name")
    

    TBLPROPERTIES("hbase.table.name" = "nancy");

    创建一个由hbase管理的外部表

    CREATE EXTERNAL TABLE hbase_table_2(key int, name string) STORED BY
    'org.apache.hadoop.hive.hbase.HBaseStorageHandler' 
    WITH SERDEPROPERTIES ("hbase.columns.mapping" = ":key,cf:name") 
    TBLPROPERTIES("hbase.table.name" = "nancy");
    

两种方式都可以通过 hive sql 插入:

    insert into  hbase_table_1 select  1, "name1" ;
    insert into  hbase_table_2 select  2, "name2" ;

hbase(main):011:0> 扫描'nancy'

行列+单元格 1 列=cf:名称, 时间戳=1491979916489,值=名称1 2列=cf:名称, 时间戳=1491979928355,值=name2 0.3250 秒内 2 行

【讨论】:

请注意,您不能使用 sparksql 来操作此插入 sql,否则您将收到错误:原因:java.lang.ClassCastException: org.apache.hadoop.hive.hbase.HiveHBaseTableOutputFormat 无法强制转换到 org.apache.hadoop.hive.ql.io.HiveOutputFormat

以上是关于如何将 Hive 表与 HBase 表映射?的主要内容,如果未能解决你的问题,请参考以下文章

创建Hbase表&Hbse表映射到hive表

建立Hive和Hbase的映射关系,通过Spark将Hive表中数据导入ClickHouse

怎样删除hive和hbase映射表

HiveContext - 无法访问在 hive 中映射为外部表的 hbase 表

SparkSQL同步Hbase数据到Hive表

如何将两个表与键中的日期合并(Python)