Hadoop回顾--Hive特性(一)

 一、Hive的特点

- HQL:一种类SQL语言

- 存储位置
    - Hive:所有数据存储在HDFS上

    - 数据库:存储在块设备或者本地文件系统中

- 数据格式
    - Hive:没有专门的数据格式,数据格式可以自定义,文件格式有三个默认格式(TextFile、SequenceFile、RCFile),由于在加载数据时不用进行格式转换

    - 数据库:有自己的存储引擎,定义自己的数据格式,所以数据库加载数据的过程会比较耗时

- 数据更新
    - Hive:是一种数据仓库,不支持对数据的改写和添加,所有数据都是在加载时确定的

    - 数据库:可以修改

- 索引
    - Hive:加载数据后没有建立索引,所以需要暴力扫描,但是在查询数据的时候实际上是MapReduce的执行过程,并行查询的效率会提高很多

    - 数据库:通常针对一个或几个列建立索引

- 执行延迟
    - Hive:没有索引,延迟较高,MapReduce框架也会增加延迟,不适合在线查询,并行计算特性适合大规模数据查询

    - 数据库:数据规模较小的时候延迟较低

- 可扩展性
    - Hive:基于HDFS,与HDFS的扩展性一致

    - 数据库:由于ACID的限制,扩展性有限

二、Hive文件格式

- TextFile:直接复制数据文件到HDFS上(默认),数据不做压缩,磁盘开销大,数据解析开销大
- SequenceFile:使用方便、可分割、可压缩。支持三种压缩格式NONE、RECORD(压缩率低)、BLOCK
- RCFile

    - 特点:快速加载数据、快速查询数据、最大化磁盘利用率、同一份数据集会供给不同用户分析

    - 结构:先水平划分,再垂直划分

    - 数据格式

        - 存储在一个HDFS块中的所有记录被划分成了多个行组,对于一张表,所有行组大小都相同

        - 行组第一部分:行组头部的同步标识,主要用于分隔HDFS块中两个连续行组

        - 行组第二部分:行组的元数据头部,用于存储行组单元的信息,包括行组中的记录数、每个列的字节数、列中每个域的字节数

        - 行组第三部分:实际的列存储数据

    - 压缩方式:元数据头部(RLE算法压缩)和表格数据段压缩(Gzip算法压缩)

    - 数据追加:仅支持尾部追加(每列维护一个已经记录元数据的内存column holder)

    - 数据读取:仅仅读取元数据头部和给定查询的列
    - Lazy压缩:如果where没有满足的列,则select查询的列没有必要解压

    - 行组大小:行组大的时候数据压缩效率会比行组小的时候更高,但高于一个阈值后会占用更多内存,这会影响并发执行的其他MapReduce作业

三、Hive操作

- 创建表

    - 创建表时ROW FORMAT DELIMITED 必须写在其他子句之前(除了STORED AS...)

    - 设置列分隔符:FIELDS TERMINATED BY '\001'

    - 设置集合元素间分隔符:COLLECTION ITEMS TERMINATED BY '\002'

    - 设置map键和值之间的分隔符:MAP KEYS TERMINATED BY '\003'

- 查询表

    - 没有解释成MapReduce的查询
        - select * from table
        - 带分区时,直接查询分区
    - Hive不支持在WHERE子句中的IN、EXIST或子查询
    - Hive不支持HAVING子句,可以将HAVING子句转换成一个子查询

    - 不允许在一个查询内存在多个DISTINCT
    - ORDER BY会对输入进行全局排序,因此只有一个Reduce
    - CLUSTER BY查询除了具有DISTRIBUTE BY的功能还具有SORT BY功能

- 视图
    - VIEW是逻辑存在,Hive不支持物化视图
    - VIEW只读
    - VIEW支持迭代视图

- 索引

    - 索引Key冗余存储,提供基于Key的数据视图

    - 存储设计以优化查询和检索性能

    - 对于某些查询减少I/O,从而提高性能

- 分区

    - 查询的时候分区的信息会添加到最后的列上,插入数据时不会检查分区数据是否正确

    - 分区数据不存储在文件中

- 动态分区

    - 动态分区按顺序写在SELECT后

    - 不允许主分区采用动态列,而副分区采用静态列
- LIKE与RLIKE的区别
    - LIKE不是正则,而是通配符; RLIKE是正则,写法与java类似

- 连接类型(对于Join,Hive会将前面的表存储在Reduce的内存中,然后后面的表流式进入Reduce与Reduce内存中的其他表进行连接)

    - 内连接(inner join)

        - 默认的查询方式

    - 左外连接(left outer join)

        - 把左边表的元组全部选出来,没有数据的内容填充NULL

    - 右外连接(right outer join)

        - 将右边表的元组全部选出来,没有数据的内容填充NULL

    - 全外连接(full outer join)

        - 综合2、3两种情况

    - 左半连接(left semi-join)

        - 用来代替in(子查询)或exists操作,只查询左表在右表有涉及的部分

    - 笛卡尔积
    - map-side join

四、数据库与数据仓库的区别

- 数据仓库(Data Warehouse)是一个面向主题的(Subject Oriented)、集成的(Integrate)、相对稳定的(Non-Volatile)、反映历史变化(Time Variant)的数据集合,用于支持管理决策。

    - 面向主题:指数据仓库中的数据是按照一定的主题域进行组织。

    - 集成:指对原有分散的数据库数据经过系统加工, 整理得到的消除源数据中的不一致性。

    - 相对稳定:指一旦某个数据进入数据仓库以后只需要定期的加载、刷新。

    - 反映历史变化:指通过这些信息,对企业的发展历程和未来趋势做出定量分析预测。

- 数据仓库建设是一个工程,是一个过程,而不是一种可以购买的产品。企业数据处理方式是以联机事务处理形式信息,并利用信息进行决策;在信息应用过程中管理信息。

- 数据仓库的出现,并不是要取代数据库。目前,大部分数据仓库还是用关系数据库管理系统来管理的。

- 数据仓库与数据库的主要区别在于:

    - 数据库是面向事务的设计,数据仓库是面向主题设计的。

    - 数据库一般存储在线交易数据,数据仓库存储的一般是历史数据。

    - 数据库设计是尽量避免冗余,数据仓库在设计是有意引入冗余。

    - 数据库是为捕获数据而设计,数据仓库是为分析数据而设计。 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: hadoop fs -getmerge命令用于将Hadoop文件系统中的多个文件合并成一个文件,并将其下载到本地文件系统中。该命令的语法如下: hadoop fs -getmerge <src> <localdst> 其中,<src>是要合并的文件的路径,可以是单个文件或一个目录,<localdst>是本地文件系统中的目标文件路径。如果<localdst>是一个目录,则合并后的文件将保存在该目录下,并以<src>的名称命名。 例如,要将Hadoop文件系统中的/mydir目录下的所有文件合并成一个文件,并将其下载到本地文件系统中的/home/user/output.txt文件中,可以使用以下命令: hadoop fs -getmerge /mydir /home/user/output.txt 执行该命令后,Hadoop将/mydir目录下的所有文件合并成一个文件,并将其下载到本地文件系统中的/home/user/output.txt文件中。如果/home/user/output.txt文件已经存在,则会将其覆盖。 ### 回答2: hadoop fs -getmerge是Hadoop命令行工具中的一个命令,它的作用是将指定HDFS目录中的所有文件合并成一个本地文件,并将该文件保存在指定路径下。该命令的使用非常方便,可以节省管理员的时间和精力。 使用hadoop fs -getmerge命令时,我们需要提供目标HDFS目录及合并后本地文件的保存路径,例如:hadoop fs -getmerge /user/data /home/user/output.txt。在执行该命令时,Hadoop将自动搜索目标HDFS目录中的所有文件,并将它们合并成一个本地文件,该文件保存在指定的输出路径中。 这个命令可以极大地方便文件的管理和操作。例如,在一个大型分布式系统中,可能存在大量的文件需要处理和合并。使用hadoop fs -getmerge命令,管理员可以通过一条简单的命令将所有文件合并为一个本地文件,不仅可以减少处理时间,也可以减轻管理员的工作负担。 此外,hadoop fs -getmerge命令也可以用于将多个小文件合并为一个大文件,这样可以减少文件的数量,提高文件系统的性能。 总之,hadoop fs -getmerge命令是Hadoop命令行工具中非常实用的命令,可以帮助管理员简化文件处理和管理的工作,提高系统性能和效率。 ### 回答3: Hadoop 是一个分布式计算框架,可处理海量数据,数据通常分布在不同的节点上。hadoop fs -getmerge 命令可以将分布式的大数据文件合并成为一个本地文件,以方便用户进行后续操作和分析。 在hadoop分布式系统中,大文件通常分成多个小文件分别存储在不同的节点上,这种存储方式可以更好地利用空间、提高效率、减少数据丢失的风险等。但在某些情况下,需要将这些小文件合并成一个大文件,以方便管理和使用。 使用 Hadoop 提供的命令行工具,我们可以使用hdfs dfs -getmerge 命令来合并多个小文件。该命令会从分布式文件系统中下载并合并多个文件并将它们转储到单个本地文件中。 该命令的基础语法如下所示: ``` hadoop fs -getmerge <src> <localdst> [<addnl>] ``` 参数说明: - <src>:需要合并的文件或目录的路径,可以是文件或通配符指定的一个文件列表。 - <localdst>:合并后文件的输出路径。 - [<addnl>]:是否在输出文件中添加换行符,默认值为true。 例如,如果需要合并名为test1、test2和test3的三个文件,可以执行以下命令: ``` hadoop fs -getmerge /user/data/* testfiles.txt ``` 此命令将所有的文件合并成一个名为testfiles.txt的本地文件。 总的来说,hadoop fs -getmerge 命令提供了一个快速合并分布式文件的方法,并且能够根据需要自定义输出选项,方便大数据的管理和维护。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ROGEN-秀发

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值