2023-02-08 07:40来源:m.sf1369.com作者:宇宇
hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供完整的sql查询功能,可以将sql语句转换为MapReduce任务进行运行。 其优点是学习成本低,可以通过类SQL语句快速实现简单的MapReduce统计,不必开发专门的MapReduce应用,十分适合数据仓库的统计分析。
Hadoop是一个存储计算框架,主要由两部分组成:
1,存储(Hadoop分布式文件系统-HDFS)
2,计算(MapReduce计算框架)
首先我假设题主问的是正统的MPP数据库对比SQL On Hadoop。因为一些SQL On Hadoop系统例如Impala也被称为MPP架构。
那么对比两边其实是诸如Vertica,阿里ADS,GreenPlum,Redshift vs Impala,Hive以及SparkSQL,Presto等。
这两者很大程度上的差异其实在于,对存储的控制。对于Hadoop而言,数据最常见的存在形式是数据湖,也就是数据本身未经很多整理,数据倾向于读取的时候再解析,而且多个系统处理不同的workload一起共享同一套数据湖。例如你可以用Spark,MR以及Impala读取Hive的数据,甚至直接读取HDFS上的Parquet,ORC文件。这份数据可以用来做BI数仓也可以用来做ML模型训练等等。
而MPP数据库则相反,MPP为了速度,需要将数据导入做一定处理,整理成优化的格式以便加速。这样做的后果就是,它们的存储类似一个黑盒,数据进去之后很难被别的系统直接读取。当然Vertica之类的系统也有SQL On Hadoop的运行模式,但是速度会有所下降,看过Vertica的Benchmark,对比Impala在Hadoop模式下,并不是有多大的优势,甚至有部分查询更慢。这部分性能损失,就是抛开黑盒存储所带来的差异。
另外SQL On Hadoop产品和MPP数据库的很多差异,其实是工程上成熟度的差异。例如CBO这样的优化,可能在数据库领域已经非常常见,但是对SQL On Hadoop还可以说是个新鲜玩意,至少为止,SparkSQL和Presto还没有CBO。而列存的引入也是近些年的事情,相对Vertica应该是从诞生就使用了列存。这些差异很可能会很快被补上。
而底层存储部分,随着Parquet ORC这样相对复杂,借用了不少传统数据库领域经验的格式不断优化,也许今后SQL On Hadoop会和MPP数据库越来越近似。
先明白数据仓库的作用--存储历史数据-进而对数据进行分析,只提供查询-不提供修改1。Hive 的目标是做成数据仓库,所以它提供了sql,提供了文件-表的映射关系,又由于Hive基于hdfs,所以搜索不提供Update,因为hdfs本身就不支持。
全不同应用场景吧,HBase 速度比 Hive 快了不知道多少。HBase 是非关系型数据库(KV型), 对 key 做索引,查询速度非常快(相比较 Hive ),适合实时查询;而Hive是关系型数据结构,适合做后期数据分析。和单机的MySQL,Oracle比较的话,Hive的优点是可以存储海量数据,只是查询速度比较慢。
首先你要安装相关的软件,然后再把数据填写进去。
HBase是个基于HDFS的数据库。Hive是用SQL替代写MR的编程框架,做Hadoop上会把用户提交的SQL语句做语法分析,执行计划等一堆乱七八糟的事后变成MR job提交去跑,返回结果给用户。不然每次都写MR很麻烦的,有这个写个SQL就可以拿到等效的结果,很...
Java在1.5过后提供了ProcessBuilder根据运行时环境启动一个Process调用执行运行时环境下的命令或应用程序(1.5以前使用Runtime),关于ProcessBuilder请参考Java相关文档。调用代码如下:
String sql=show tables; select * from test_tb limit 10;
List<String> command = new ArrayList<String>();
command.add(hive);
command.add(-e);
command.add(sql);
List<String> results = new ArrayList<String>();
ProcessBuilder hiveProcessBuilder = new ProcessBuilder(command);
hiveProcess = hiveProcessBuilder.start();
BufferedReader br = new BufferedReader(new InputStreamReader(
hiveProcess.getInputStream()));
String data = null;
while ((data = br.readLine()) != null) {
results.add(data);
}
其中command可以是其它Hive命令,不一定是HiveQL。
关系数据库里,表的加载模式是在数据加载时候强制确定的(表的加载模式是指数据库存储数据的文件格式),如果加载数据时候发现加载的数据不符合模式,关系数据库则会拒绝加载数据,这个就叫“写时模式”,写时模式会在数据加载时候对数据模式进行检查校验的操作。Hive在加载数据时候和关系数据库不同,hive在加载数据时候不会对数据进行检查,也不会更改被加载的数据文件,而检查数据格式的操作是在查询操作时候执行,这种模式叫“读时模式(schema on read)”。在实际应用中,写时模式在加载数据时候会对列进行索引,对数据进行压缩,因此加载数据的速度很慢,但是当数据加载好了,我们去查询数据的时候,速度很快。但是当我们的数据是非结构化,存储模式也是未知时候,关系数据操作这种场景就麻烦多了,这时候hive就会发挥它的优势。