因为我注意到这个问题很受欢迎,所以我决定回答它,因为自从我提出这个问题以来,我已经很好地解决了这个问题。首先,因为 Hadoop 2.0 HCatalog 和 Hive 被视为一个产品。Hive 默认在 HCatalog 中创建表。这意味着 HCatalog 的自然接口是 Hive。因此,您可以使用所有 SQL-92 DML ( https://cwiki.apache.org/confluence/display/Hive/LanguageManual+DML ) 和 DDL ( https://cwiki.apache.org/confluence/display/Hive/LanguageManual +DDL ),从 开始create/alter/drop database
,到create/alter/drop table
以等结尾select, insert into
... 唯一的例外是 insert 仅作为 insert into ... 作为 select from 起作用。对于典型的插入,我们必须使用:
LOAD DATA [LOCAL] INPATH 'filepath' [OVERWRITE] INTO TABLE tablename [PARTITION (partcol1=val1, partcol2=val2 ...)]
表可以有分区、索引(但根据我的经验,它不能很好地工作),但你它不是一个关系数据库,所以你不能使用外键。
与 HBase 完全不同。这是 noSQL 数据库之一(但正如在 上一篇文章中回答的那样,Hive 可以是 SQL 查询的 HBase 接口)它具有键-> 值组织表。让我们比较一些命令(创建表、插入表、从表中选择、删除表
蜂巢:
create table table_name (
id int,
value1 string,
value2 string
)
partitioned by (date string)
LOAD DATA INPATH 'filepath' ] INTO TABLE table_name [PARTITION (partcol1=val1, partcol2=val2 ...)]
INSERT INTO table_name as select * from othertable
SELECT * FROM table_name
DROP TABLE table_name
HBase:
hbase> create 'test', 'cf'
hbase> put 'test', 'row1', 'cf:a', 'value1'
hbase> get 'test', 'row1'
hbase> disable 'test'
hbase> drop 'test'
如您所见,语法完全不同。对于 SQL 用户来说,使用 HCatalog 是很自然的,使用 noSQL 数据库的用户会觉得 HBase 很舒服。