TL;DR 我可以在 Hive (Hive Server 1) 命令行中对 HBase 表使用 INNER JOIN 执行 Hive 查询并返回正确的行。但是,直线 (Hive Server 2) 命令行上的相同查询不返回任何行。我可以在 HDFS 表上的常规 Hive 上进行 INNER JOIN 罚款。
我已经在以下 MapR 环境中复制了它:
MapR version: 4.0.1.27334.GA -- Hive version: hive-0.13
MapR version: 5.1.0.37549.GA -- Hive version: hive-1.2.0
我制作了两个 HBase 表并像这样填充它们(请注意,在 MapR 中,我们使用分区作为基本名称。如果您想在非 MapR 环境中复制它,请删除该/app/my_partition/
部分):
create '/app/my_partition/HiveParent', 'f'
create '/app/my_partition/HiveChild', 'f'
put '/app/my_partition/HiveParent', 'foo|a|', 'f:foo', 'a'
put '/app/my_partition/HiveParent', 'foo|b|', 'f:foo', 'b'
put '/app/my_partition/HiveChild', 'foo|a|1|', 'f:foo', 'a'
put '/app/my_partition/HiveChild', 'foo|a|1|', 'f:bar', '1'
put '/app/my_partition/HiveChild', 'foo|a|2|', 'f:foo', 'a'
put '/app/my_partition/HiveChild', 'foo|a|2|', 'f:bar', '2'
put '/app/my_partition/HiveChild', 'foo|b|1|', 'f:foo', 'b'
put '/app/my_partition/HiveChild', 'foo|b|1|', 'f:bar', '1'
put '/app/my_partition/HiveChild', 'foo|b|2|', 'f:foo', 'b'
put '/app/my_partition/HiveChild', 'foo|b|2|', 'f:bar', '2'
我在 hive shell 中创建了 Hive on HBase 表,如下所示:
CREATE EXTERNAL TABLE HiveParent(rk string, foo string)
ROW FORMAT SERDE
'org.apache.hadoop.hive.hbase.HBaseSerDe'
STORED BY
'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
WITH SERDEPROPERTIES (
'serialization.format'='1',
'hbase.columns.mapping'='f:foo'
) TBLPROPERTIES (
'hbase.table.name'='/app/my_partition/HiveParent'
);
CREATE EXTERNAL TABLE HiveChild(rk string, foo string, bar string)
ROW FORMAT SERDE
'org.apache.hadoop.hive.hbase.HBaseSerDe'
STORED BY
'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
WITH SERDEPROPERTIES (
'serialization.format'='1',
'hbase.columns.mapping'='f:foo,f:bar'
) TBLPROPERTIES (
'hbase.table.name'='/app/my_partition/HiveChild'
);
以下所有查询在 Hive (Hive Server 1) 和 Beeline (Hive Server 2) 中都能成功运行:
SELECT * FROM HiveParent;
SELECT foo FROM HiveParent;
SELECT foo FROM HiveParent WHERE foo IN ('a', 'b');
SELECT * FROM HiveChild;
SELECT foo, bar FROM HiveChild;
SELECT foo, bar FROM HiveChild WHERE foo IN ('a', 'b');
这些查询仅返回 Hive (Hive Server 1) 中的行。但是,它们在 Beeline (Hive Server 2) 中返回 0 行:
SELECT * FROM HiveParent INNER JOIN HiveChild ON (HiveParent.foo = HiveChild.foo);
SELECT * FROM HiveParent, HiveChild WHERE HiveParent.foo = HiveChild.foo;
SELECT * FROM HiveChild WHERE HiveChild.foo IN (SELECT HiveParent.foo FROM HiveParent);
编辑:我已将此问题交叉发布到 MapR 的问答网站,因为这并没有引起任何关注。如果有答案,我会在此处发布答案。