所以我试图更好地理解HIVE。我在之前的角色中简要地使用过它,但我从来没有完全清楚它。我的问题是
HIVE是否也用于数据存储,或者严格地作为Hadoop集群上的数据查询手段?换句话说,是否需要将数据移动到HIVE数据库/环境中才能进行查询?或者HIVE可以用来直接查询Hadoop集群吗?
谢谢!
简短回答:Hive不是一个数据存储,它可以使用表从存储中查询数据(schema定义,用于数据序列化/反序列化的SerDe
和数据位置在create-table语句中定义)。
长答:
数据存储在HDFS
或其他Hadoop兼容的文件系统,如S3
(可以完全从Hadoop集群分离)。
Hive是一个数据库:它有丰富的SQL(DDL和DML),元数据包括统计数据和表定义,访问授权,基于成本的优化器,可以使用不同的查询引擎:MR
(MapReduce)和Tez
。Hive与传统RDBMS的区别在于Hive使用了读时模式(schema-on-read)的概念:数据的存储方式和读取方式是完全分离的,读取数据时应用模式,数据文件可以通过一些外部进程添加到HDFS中。
Hive可以读取不同的结构化文件(如JSON, Avro, CSV, Parquet, ORC等)以及半结构化文件(使用RegexSerDe或任何其他,甚至自定义SerDe)。Hive还可以连接到其他JDBC源,方便集成和读写。
在Hive中,表或分区是HDFS中的一个位置+包含模式定义、SerDe、统计数据、访问授权的元数据.
您可以在某些现有位置上创建表,甚至可以在同一位置上创建多个表(即使具有不同的模式)。阅读这个关于在同一位置上的多个表的答案,以及这个关于托管/外部表的答案:https://stackoverflow.com/a/54242477/2700344。
您可以直接将文件放入表位置或使用HDFS命令删除文件,它会在Hive返回的数据集中反映,也支持LOAD INTO TABLE
命令,它会为您将文件放入表位置,您不需要知道位置路径。