1

我有一张表HBase,我想将其表示EXTERNAL TABLEhive

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

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 分区列之间映射的文档

4

1 回答 1

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 表,但这也取决于您的用例。

问候,迪诺

于 2013-05-16T06:01:08.930 回答