我创建了一个HBase表,如下所示:
create 'nancy', 'cf'
并在Hive中创建了一个表格,如下所示:
create external table nancy( id 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.columns.mapping"中的键表示什么?
谁能解释这个映射?
您是否遇到任何特定问题?查询对我来说看起来不错。
键表示您正在将该字段用作表键。请记住,配置单元表中的每个字段都可以映射到以下字段之一:
表键(使用:key作为选择器)
列族(cf:)(Hive中的MAP字段
柱
回应您的意见:
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表。创建带有SERDEPROPERTIES(" hbase.columns.mapping" =":key,cf:name")的org.apache.hadoop.hive.hbase.HBaseStorageHandler存储的外部表hbase_table_2(键int,名称字符串)TBLPROPERTIES(" hbase.table .name" =" nancy");它没有显示任何错误,但是当我执行select *时,HBase表中的数据没有显示。
哪张桌子? Hbase? hbase(main):001:0>描述nancy描述已启用{NAME => nancy,FAMILIES => [{NAME => cf,BLOOM true FILTER => NONE,REPLICATION_SCOPE => 0,VERSION S => 3,压缩=> NONE,MIN_VERSIONS => 0,TTL => 2147483647,BLOCKSIZE => 65536,IN_ME MORY => false,BLOCKCACHE => true}]} 1行(在1.0500秒内)
我复制了您的命令,它在我的机器上运行正常。请参阅编辑后的答案。
我使用put命令..我可以在Hive中创建表,但是表中没有记录。在HBase表中有记录。
放好也可以。您是否可以通过Hive插入数据?hive.log中有什么有趣的东西吗?
在HBase表中,以下是我放置数据的方式。 hbase(main):001:0>扫描nancy ROW COLUMN + CELL row1 column = cf:a,时间戳= 1375338887793,value = nancy row2 column = cf:a,timestamp = 1375340617269,value = mary row3 column = cf:a, timestamp = 1375340626864,value = maria row4 column = cf:a,timestamp = 1375340636988,value = sana这是对的吗?
嘿,我知道了..它奏效了...我将第1行更改为1 ..现在,我可以在Hive中显示HBase的数据了。
很高兴得知您正在使用它。但我想知道为什么您需要更改行键。
问题是映射":key, cf:name"的列中的空格字符。 Hive寻找一个名为" cf"而不是" cf"的列族。因为Tariq的响应(":key,cf:name")中没有空格,所以它可以正常工作。
您有两个选择将hive表与hbase表映射:
创建一个hive和hbase都可以管理的表(例如delete)
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> scan 'nancy'
ROW COLUMN+CELL
1 column=cf:name,
timestamp=1491979916489, value=name1
2 column=cf:name,
timestamp=1491979928355, value=name2
2 row(s) in 0.3250 seconds
请注意,您不能使用sparksql对该插入sql进行运算,否则会出现错误:原因:java.lang.ClassCastException:org.apache.hadoop.hive.hbase.HiveHBaseTableOutputFormat无法转换为org.apache.hadoop.hive .ql.io.HiveOutputFormat