创建在hbase列上分区的外部表的语法是什么?

时间:2013-05-15 13:57:52

标签: hbase hive

我在HBase中有一个表格,我希望在EXTERNAL TABLE

中表示为hive

到目前为止,我一直在使用:

CREATE EXTERNAL TABLE events(key STRING, day INT, source STRING, ip STRING)
STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
WITH SERDEPROPERTIES ("hbase.columns.mapping"=":key,c:date#b,c:source,c:ipAddress")
TBLPROPERTIES ("hbase.table.name" = "eventTable");

但是我的查询器在我的映射器中没有正确平衡,所以我试图在ip地址上进行分区:

CREATE EXTERNAL TABLE events(key STRING, source STRING)
PARTITIONED BY (ip STRING)
STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
WITH SERDEPROPERTIES ("hbase.columns.mapping"=":key,c:date#b,c:source,c:ipAddress")
TBLPROPERTIES ("hbase.table.name" = "eventTable");

但是我收到有关不正确的列映射的错误:

FAILED: Error in metadata: java.lang.RuntimeException:   
 MetaException(message:org.apache.hadoop.hive.serde2.SerDeException 
 org.apache.hadoop.hive.hbase.HBaseSerDe: columns has 2 elements while hbase.columns.mapping has 3 elements (counting the key if implicit))
FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask

我一直在四处寻找,但我找不到任何指示如何在hbase列和hive分区列之间进行映射的文档

1 个答案:

答案 0 :(得分:1)

我认为您无法轻松地对外部表进行分区,尤其是当底层存储是HBase时。

Hive分区策略的构建方式是来自特定分区的数据存储在单独的文件夹(“或任何其他存储”)中。由于使用HBase进行分区(如果存在)将需要使用更多表或使用HBase版本。

我认为这篇文章可以让您更好地理解分区http://blog.zhengdong.me/2012/02/22/hive-external-table-with-partitions

在这个地方https://cwiki.apache.org/Hive/hbaseintegration.html,您可以发现HBase中的分区留待将来使用。

如果您想要分区,我建议您将数据从HBase / Hive加载到HDFS / Hive表,但这也取决于您的使用情况。

此致 恐龙