MENU

Hadoop学习笔记

February 15, 2022 • Read: 512 • 杂谈阅读设置

Hadoop

简介

核心组件

  • Hadoop HDFS(分布式文件存储系统):解决海量数据存储
  • Hadoop YARN(集群资源管理和任务调度框架):解决资源任务调度
  • Hadoop MapReduce(分布式计算框架):解决海量数据计算

特性

  • 扩容能力:集群可扩展到数以千计的节点
  • 成本低:运行通过普通机器组成集群
  • 效率高:并发处理数据
  • 可靠性:自动维护数据的多份复制,并在任务失败后能自动重新部署

Hadoop 集群

Hadoop集群包含两个集群,两个集群都是主从架构集群,逻辑上分类、物理上在一起:

  • HDFS集群(分布式存储):NameNode+DataNode+SecondaryNameNode
  • YARN集群(资源管理、调度):ResourceManger+NodeManager

Hadoop源码编译(或者可以直接下载jar包):

  • 安装依赖

    yum install gcc gcc-c++ make autoconf automake libtool curl lzo-devel zlib-devel openssl openssl-devel ncurses-devel snappy snappy-devel bzip2 bzip2-devel lzo lzo-devel lzop libXtst zlib -y
    
    yum install -y doxygen cyrus-sasl* saslwrapper-devel*
  • 安装cmake、snappy,需要版本支持
  • 安装JDK1.8并配置环境变量
  • 安装配置maven,配置环境变量,配置阿里云仓库
  • 安装ProtocolBuffer 3.7.1
  • 编译Hadoop

    tar zxvf hadoop-3.3.0-src.tar.gz
    cd /root/hadoop-3.3.0-src
    
    mvn clean package -Pdist,native -DskipTests -Dtar -Dbundle.snappy -Dsnappy.lib=/usr/local/lib

Hadoop集群分布式安装

  • 集群规划,主机角色安排
  • 基础环境配置,配置各台设备hosts,同步集群时间,防火墙关闭,ssh免密登录,JDK1.8环境
  • 解压hadoop包(这里直接采用官网的包,也可以采用上面的编译源码实现)

    tar zxvf hadoop-3.3.0-Centos7-64-with-snappy.tar.gz
  • 修改配置文件

    • hadoop-env.sh

      #文件最后添加
      export JAVA_HOME=/export/server/jdk1.8.0_241
      
      export HDFS_NAMENODE_USER=root
      export HDFS_DATANODE_USER=root
      export HDFS_SECONDARYNAMENODE_USER=root
      export YARN_RESOURCEMANAGER_USER=root
      export YARN_NODEMANAGER_USER=root 
    • core-site.xml:集群全局参数
    • hdfs-site.xml:HDFS参数
    • mapred-site.xml:MapReduce参数
    • yarn-site.xml:YARN参数
  • 分发同步hadoop安装包,在一台机器上配置好分发到集群其它机器

    cd /export/server
    
    scp -r hadoop-3.3.0 root@node2:$PWD
    scp -r hadoop-3.3.0 root@node3:$PWD
  • 添加Hadoop到环境变量
  • Hadoop集群启动

    • 首次启动需要格式化namenode

      hdfs namenode -format
    • 脚本启动与关闭

      #HDFS集群
          start-dfs.sh
          stop-dfs.sh
      #YARN集群
          start-yarn.sh
          stop-yarn.sh
      #Hadoop集群
          start-all.sh
          stop-all.sh
    • Web UI Page

Hadoop HDFS

HDFS应用场景

  • 适合场景:大文件、数据流式访问、一次写入多次读出、低成本部署,廉价PC、高容错
  • 不适合场景:小文件、数据交互式访问、频繁任意修改、低延迟处理

HDFS整体概述(重要特性):

  • 主从架构:Namenode是HDFS主节点,存储元数据,DataNode从节点,存储数据
  • 分块存储:文件在物理上是分块存储(block),默认block-size为128M,不足128M为一块。更改默认块大小可以修改hdfs-default.xml中dfs.blocksize
  • 副本机制:文件的所有block都会有副本,副本数由参数dfs.replication控制,默认值是3,也就是会额外再复制2份,连同本身总共3份副本。副本存储策略:

    • 第一块副本:优先客户端本地,否则随机
    • 第二块副本:不同于第一块副本的不同机架。
    • 第三块副本:第二块副本相同机架不同机器。
  • 元数据记录:NameNode管理的元数据具有以下两种类型

    • 文件自身属性信息:文件名称、权限,修改时间,文件大小,复制因子,数据块大小。
    • 文件块位置映射信息:记录文件块和DataNode之间的映射信息,即哪个块位于哪个节点上。
  • 抽象统一的目录树结构:支持传统的层次性文件组织结构
  • 数据块存储:文件的各个block具体存储由datanode承担,每个block都可以在多个datanode上存储。

HDFS shell操作

hadoop fs -ls file:///    #操作本地文件系统
hadoop fs -ls hdfs://node1:8020/    #操作HDFS分布式文件系统
hadoop fs -ls /    #直接根目录,没有指定协议,将加载读取fs.defaultFS值


# 常用命令

# 创建文件夹
hadoop fs -mkdir [-p] <path>     #-p沿着路径递归创建

# 查找指定目录下内容
hadoop fs -ls [-h] [-R] [<path>]    #-h显示文件size -R递归查看目录以及子目录

# 上传文件到HDFS指定目录
hadoop fs -put [-f] [-p] <localsrc>...<dst>    #-f覆盖目标文件 -p保留访问和修改时间,所有权和权限
# e.g.   hadoop fs -put file:///etc/profile hdfs:///node1:8020/test
# e.g.     hadoop fs -put zookeeper.out /test

# 查看HDFS文件内容
hadoop fs -car <src> 

# 下载HDFS文件
hadoop fs -get [-f] [-p] <src>...<localsrc>

# 拷贝HDFS文件
hadoop fs -cp [-f] <src>...<dst>

# 追加数据到HDFS文件
hadoop fs -appendToFile <localsrc>...<dst>

# HDFS数据移动操作
hadoop fs -mv <src>...<dst>

HDFS 集群角色

  • NameNode:维护和管理文件系统元数据,访问HDFS的唯一入口

    • 仅存储HDFS的元数据
    • 知道HDFS中任何给定文件的块列表及其位置
    • 不持久化存储每个文件中各个块所在的datanode的位置信息,这些信息会在系统启动时从DataNode重建。
    • 是Hadoop集群中的单点故障。
    • NameNode所在机器通常会配置有大量内存(RAM)
  • DataNode:负责具体的数据块存

    • 最终数据块block的存储
    • DataNode启动时,会将自己注册到NameNode并汇报自己负责持有的块列表。
    • 当某个DataNode关闭时,不会影响数据的可用性。NameNode将安排由其他DataNode管理的块进行副本复制。
    • DataNode所在机器通常会配置有大量磁盘空间
  • SecondaryNameNode:充当NameNode的辅助节点,但不能替代NameNode。主要是帮助主角色进行元数据文件的合并动作

HDFS写数据(上传文件)

image-20220202155830147

  1. HDFS客户端创建对象实例DistributedFileSystem,该对象中封装了与HDFS文件系统操作的相关方法。
  2. 调用DistributedFileSystem对象的create()方法,通过RPC请求NameNode创建文件。NameNode执行各种检查判断:目标文件是否存在、父目录是否存在、客户端是否具有创建该文件的权限。检查通过,NameNode就会为本次请求记下一条记录,返回FSDataOutputStream输出流对象给客户端用于写数据。
  3. 客户端通过FSDataOutputStream输出流开始写入数据。
  4. 客户端写入数据时,将数据分成一个个数据包(packet 默认64k),内部组件DataStreamer请求NameNode挑选出适合存储数据副本的一组DataNode地址,默认是3副本存储。

DataStreamer将数据包流式传输到pipeline的第一个DataNode,该DataNode存储数据包并将它发送到pipeline的第二个DataNode。同样,第二个DataNode存储数据包并且发送给第三个(也是最后一个)DataNode。

  1. 传输的反方向上,会通过ACK机制校验数据包传输是否成功;
  2. 客户端完成数据写入后,在FSDataOutputStream输出流上调用close()方法关闭。
  3. DistributedFileSystem联系NameNode告知其文件写入完成,等待NameNode确认。因为namenode已经知道文件由哪些块组成(DataStream请求分配数据块),因此仅需等待最小复制块即可成功返回。最小复制是由参数dfs.namenode.replication.min指定,默认是1.

HDFS读数据(下载文件)

image-20220202160100167

  1. HDFS客户端创建对象实例DistributedFileSystem,调用该对象的open()方法来打开希望读取的文件。
  2. DistributedFileSystem使用RPC调用namenode来确定文件中前几个块的块位置(分批次读取)信息。对于每个块,namenode返回具有该块所有副本的datanode位置地址列表,并且该地址列表是排序好的,与客户端的网络拓扑距离近的排序靠前。
  3. DistributedFileSystem将FSDataInputStream输入流返回到客户端以供其读取数据。
  4. 客户端在FSDataInputStream输入流上调用read()方法。然后,已存储DataNode地址的InputStream连接到文件中第一个块的最近的DataNode。数据从DataNode流回客户端,结果客户端可以在流上重复调用read()。
  5. 当该块结束时,FSDataInputStream将关闭与DataNode的连接,然后寻找下一个block块的最佳datanode位置。这些操作对用户来说是透明的。所以用户感觉起来它一直在读取一个连续的流。客户端从流中读取数据时,也会根据需要询问NameNode来检索下一批数据块的DataNode位置信息。
  6. 一旦客户端完成读取,就对FSDataInputStream调用close()方法。

Hadoop MapReduce

MapReduce的核心思想是“先分再合,分而治之”。

  • Map表示第一阶段,负责“拆分”:即把复杂的任务分解为若干个“简单的子任务”来并行处理。可以进行拆分的前提是这些小任务可以并行计算,彼此间几乎没有依赖关系。
  • Reduce表示第二阶段,负责“合并”:即对Map阶段的结果进行全局汇总。

MapReduce设计构思

  1. 采用分而治之的策略应对大数据处理场景
  2. 构建抽象编程模型

map: 对一组数据元素进行某种重复式的处理;
reduce: 对Map的中间结果进行某种进一步的结果整理。

map: (k1; v1) → (k2; v2) reduce: (k2; [v2]) → (k3; v3)

MapReduce处理的数据类型是<key,value>键值对

  1. 统一架构、隐藏底层细节

通过抽象模型与计算框架把需要做什么(what need to do)与具体怎么做(how to do)分开了,为程序员提供一个抽象和高层的编程接口和框架。

程序员仅需要关心其应用层的具体计算问题,仅需编写少量的处理应用本身计算问题的业务程序代码。

MapReduce特点

  • 易于编程:提供了用于二次开发的接口,简单实现接口,即可完成分布式程序
  • 良好的扩展性:当计算机资源不能得到满足的时候,可以通过增加机器来扩展它的计算能力。
  • 高容错性:单一机器节点宕机,可将计算任务转移其它节点,这由Hadoop内部完成
  • 适合海量数据的离线处理

MapReduce局限性

  • 实时计算性能差,主要用于离线计算
  • 不能进行流式计算,主要针对静态数据,即数据时不能动态变化的。

MapReduce实例进程:一个完整的MapReduce程序在分布式运行时有三类

  • MRAppMaster:负责整个MR程序的过程调度及状态协调
  • MapTask:负责map阶段的整个数据处理流程
  • ReduceTask:负责reduce阶段的整个数据处理流程

MapReduce阶段组成:一个MapReduce编程模型中只能包含一个Map阶段和一个Reduce阶段,或者只有Map阶段;如果用户的业务逻辑非常复杂,那就只能多个MapReduce程序串行运行。

MapReduce官方示例程序

  • 程序路径:hadoop-3.3.0/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.3.0.jar
  • 程序提交命令:[hadoop jar|yarn jar] hadoop-mapreduce-examples-3.3.0.jar args…
  • 评估PI值:hadoop jar hadoop-mapreduce-examples-3.3.0.jar pi 10 50参数PI表任务,参数10指并发数,参数50每个map任务取样的个
  • wordcount任务:

    hadoop fs -mkdir /input
    hadoop fs -put 1.txt /input
    hadoop jar hadoop-mapreduce-examples-3.3.0.jar wordcount /input /output 

MapReduce整体执行流程

image-20220202161623495

  • Map阶段执行过程

    1. 把输入目录下文件按照一定的标准逐个进行逻辑切片,形成切片规划。每一个切片由一个MapTask处理
    2. 对切片中的数据按照一定的规则读取解析返回<key,value>对。默认是按行读取数据。
    3. 调用Mapper类中的map方法处理数据。
    4. 按照一定的规则对Map输出的键值对进行分区partition。默认不分区,因为只有一个reducetask。分区的数量就是reducetask运行的数量。
    5. Map输出数据写入内存缓冲区,达到比例溢出到磁盘上。溢出spill的时候根据key进行排序sort。默认根据key字典序排序。
    6. 对所有溢出文件进行最终的merge合并。
    • Reduce阶段执行过程

    image-20220202162233087

    1. ReduceTask会主动从MapTask复制拉取属于需要自己处理的数据。
    2. 把拉取来数据,全部进行合并merge,即把分散的数据合并成一个大的数据。再对合并后的数据排序。
    3. 对排序后的键值对调用reduce方法。键相等的键值对调用一次reduce方法。最后把这些输出的键值对写入到HDFS文件中。
    • Shuffle机制

      • 将map端的无规则输出按指定的规则“打乱”成具有一定规则的数据,以便reduce端接收处理。
      • 一般把从Map产生输出开始到Reduce取得数据作为输入之前的过程称作shuffle。
      • Shuffle是MapReduce程序的核心。Shuffle中频繁涉及到数据在内存、磁盘之间的多次往复。
      • Map端Shuffle

        • Collect阶段:将MapTask的结果收集输出到默认大小为100M的环形缓冲区,保存之前会对key进行分区的计算,默认Hash分区。
        • Spill阶段:当内存中的数据量达到一定的阀值的时候,就会将数据写入本地磁盘,在将数据写入磁盘之前需要对数据进行一次排序的操作,如果配置了combiner,还会将有相同分区号和key的数据进行排序。
        • Merge阶段:把所有溢出的临时文件进行一次合并操作,以确保一个MapTask最终只产生一个中间数据文件
      • Reducer端shuffle

        • Copy阶段:ReduceTask启动Fetcher线程到已经完成MapTask的节点上复制一份属于自己的数据。
        • Merge阶段:在ReduceTask远程复制数据的同时,会在后台开启两个线程对内存到本地的数据文件进行合并操作。
        • Sort阶段:在对数据进行合并的同时,会进行排序操作,由于MapTask阶段已经对数据进行了局部的排序,ReduceTask只需保证Copy的数据的最终整体有效性即可。

    Hadoop YARN

    YARN(Yet Another Resource Negotiator)是一个通用资源管理系统和调度平台:

    • 资源管理系统:集群的硬件资源,和程序运行相关,比如内存、CPU等。
    • 调度平台:多个程序同时申请计算资源如何分配,调度的规则(算法)。
    • 通用:不仅仅支持MapReduce程序,理论上支持各种计算程序。

    YARN三大组件

    • ResourceManager(RM):主角色,决定系统中所有应用程序之间资源分配的最终权限,即最终仲裁者。
    • NodeManager(NM):从角色,负责管理本机器上的计算资源。根据RM命令,启动Container容器、监视容器的资源使用情况。并且向RM主角色汇报资源使用情况。
    • ApplicationMaster(App Mstr):用户提交的每个应用程序均包含一个AM。负责程序内部各阶段的资源申请,监督程序的执行情况。
    • RM和NM是集群物理层面,AM是App层面

    核心交互流程

    • MR作业提交Client-->RM
    • 资源的申请MrAppMaster-->RM
    • MR作业状态汇报Container(Map|Reduce Task)-->Container(MrAppMaster)
    • 节点的状态汇报NM-->RM

    MR提交YARN交互流程

    image-20220202163601206

    总体分两个阶段

    • 第一个阶段是客户端申请资源启动运行本次程序的ApplicationMaster;
    • 第二个阶段是由ApplicationMaster根据本次程序内部具体情况,为它申请资源,并监控它的整个运行过程,直到运行完成。

    YARN资源调度器Scheduler

    • YARN调度程序的工作是根据一些定义的策略为应用程序分配资源。在YARN中,负责给应用分配资源的就是Scheduler,它是ResourceManager的核心组件之一
    • 调度器策略

    FIFO Scheduler(先进先出调度器)、Capacity Scheduler(容量调度器)、Fair Scheduler(公平调度器)。

    Hive

    数仓简介:

    • 数据仓库(英语:Data Warehouse,简称数仓、DW),是一个用于存储、分析、报告的数据系统。
    • 数据仓库本身并不“生产”任何数据,也不需要“消费”任何的数据,专注分析
    • 数据存储:联机事务处理系统(OLTP) 关系型数据库(RDBMS)是OLTP典型应用,比如:Oracle、MySQL、SQL Server等
    • 在OLTP系统下进行数据分析也可以,但是没必要。因此数仓专注数据分析,为什么?

      • 数据分析会增大数据读取压力
      • OLTP仅存储数周或数月的数据
      • 数据分散在不同系统不同表中,字段类型属性不统一
    • 数仓主要特征:

      • 面向主题:主题是一个抽象的概念,是较高层次上数据综合、归类并进行分析利用的抽象,即数据分析是面向主题的
      • 集成性:主题相关数据会集成到数仓主题下;需要统一与综合,对数据进行抽取、清理、转换和汇总(如单位、同名异义等)
      • 非易失性:是数据分析的平台,而非创造数据的平台;数据仓库的数据反映的是一段相当长的时间内历史数据的内容;查询操作多,修改删除少
      • 时变性:数据随时间更新,以适应决策需要

    Hive简介:

    • Apache Hive是一款建立在Hadoop之上的开源数据仓库系统,可以将存储在Hadoop文件中的结构化、半结构化数据文件映射为一张数据库表,基于表提供了一种类似SQL的查询模型,称为Hive查询语言(HQL),用于访问和分析存储在Hadoop文件中的大型数据集。
    • Hive核心是将HQL转换为MapReduce程序,然后将程序提交到Hadoop群集执行。
    • 优点

      • 避免直接写MR,使用MR直接处理数据需要掌握Java,实现复杂逻辑开发难度大
      • Hive操作接口采用类SQL语法,易于上手
      • 支持自定义函数,功能扩展方便
      • 背靠Hadoop,擅长存储分析海量数据集
    • Hive与Hadoop:Hive利用HDFS存储数据,利用MapReduce查询分析数据。用户专注于编写HQL,Hive将其转化为MapReduce程序完成对数据的分析。

    Hive架构

    image-20220203115148987

    • 用户接口:包括CLI、JDBC/ODBC、WebGU
    • 元数据存储:通常是存储在关系数据库如mysql/derby中。Hive 中的元数据包括表的名字,表的列和分区及其属性,表的属性(是否为外部表等),表的数据所在目录等。Metastore即元数据服务。Metastore服务的作用是管理metadata元数据。MateStore配置存在内嵌模式(Derby,不单独配置)、本地模式(Mysql,不单独配置),远程模式(Mysql,单独配置)。一般采用远程模式。

    image-20220203115414018

    • Driver驱动程序,包括语法解析器、计划编译器、优化器、执行器:完成HQL 查询语句从词法分析、语法分析、编译、优化以及查询计划的生成。生成的查询计划存储在HDFS 中,并在随后有执行引擎调用执行。
    • 执行引擎:Hive本身并不直接处理数据文件。而是通过执行引擎处理。当下Hive支持MapReduce、Tez、Spark3种执行引擎

    Hive部署(matestore远程模式):

    1. Hadoop集群健康可用,因为Hive基于Hadoop;

    整合Hadoop和Hive,修改Hadoop中core-site.xml,并且Hadoop集群同步配置文件,重启生效。

    1. Mysql安装与初始化配置,可能需要卸载CentOS默认的mariadb
    2. Hive安装

      • 上传解压安装包
      • 解决Hive与Hadoop之间guava版本差异

        cd /export/server/apache-hive-3.1.2-bin/
        rm -rf lib/guava-19.0.jar
        cp /export/server/hadoop-3.3.0/share/hadoop/common/lib/guava-27.0-jre.jar ./lib/
      • 修改配置文件

        • hive-env.sh
        • hive-site.xml
      • 上传mysql jdbc驱动到hive安装包lib下
      • 初始化matedata

        cd /export/server/apache-hive-3.1.2-bin/
        
        bin/schematool -initSchema -dbType mysql -verbos
        #初始化成功会在mysql中创建74张表
      • 启动hive:hive自带有:beeline cli连接或者hive cli连接,beeline安全性更高,而二代客户端。可以采用可视化客户端连接,如DataGrip

        • 启动matestore

          #前台启动  关闭ctrl+c
          /export/server/apache-hive-3.1.2-bin/bin/hive --service metastore
          
          #前台启动开启debug日志
          /export/server/apache-hive-3.1.2-bin/bin/hive --service metastore --hiveconf hive.root.logger=DEBUG,console  
          
          #后台启动 进程挂起  关闭使用jps+ kill -9
          nohup /export/server/apache-hive-3.1.2-bin/bin/hive --service metastore &
     * 启动hiveserver2
    
      nohup /export/server/apache-hive-3.1.2-bin/bin/hive --service hiveserver2 &
    
      #注意 启动hiveserver2需要一定的时间  不要启动之后立即beeline连接 可能连接不上
     * beeline连接
    
    /export/server/apache-hive-3.1.2-bin/bin/beeline
    
    beeline> ! connect jdbc:hive2://node1:10000
    beeline> root

    DDL语法

    • CREATE (DATABASE|SCHEMA) [IF NOT EXISTS] database_name
      [COMMENT database_comment]
      [LOCATION hdfs_path]
      [WITH DBPROPERTIES (property_name=property_value, ...)];#用于指定一些数据库的属性配置。
      
      
      USE DATABASE;
      
      DROP (DATABASE|SCHEMA) [IF EXISTS] database_name [RESTRICT|CASCADE];
    • CREATETABLE[IF NOT EXISTS] [db_name.]table_name
      (col_name data_type [COMMENT col_comment], ... )
      [COMMENT table_comment]
      [ROW FORMAT DELIMITED …];
      
      # ROW FORMATDELIMITED语法用于指定字段之间等相关的分隔符,这样Hive才能正确的读取解析数据。
      # Hive默认的分割符是'\001'
      # LazySimpleSerDe是Hive默认的,包含4种子语法,分别用于各种情况的分隔符号。如下:
      ROW FORMAT DELIMITED
          [FIELDS TERMINATED BY char]#指定字段之间分隔符
          [COLLECTION ITEMS TERMINATED BY char]#集合元素之间分隔符
          [MAP KEYS TERMINATED BY char]#Map映射kv之间分隔符
          [LINES TERMINATED BY char]#行数据之间分隔符
    • Show语法

      #1、显示所有数据库SCHEMAS和DATABASES的用法功能一样
      show databases;
      show schemas;
      
      #2、显示当前数据库所有表
      show tables;
      SHOW TABLES [IN database_name]; #指定某个数据库
      
      #3、查询显示一张表的元数据信息
      desc formatted tablename;

    DML语法

    • 加载数据Load 也可以采用hadoop fs –put|-mv 或者web页面操作将数据移动到表文件夹下

      LOAD DATA [LOCAL] INPATH 'filepath' [OVERWRITE] INTO TABLE tablename;

    可以上传本地数据或者hadoop数据,LOCAL指的本地是Hiveserver2服务所在机器的本地Linux文件系统,而非Hive客户端所在的本地文件系统

    Load将数据文件移动到与Hive表对应的位置,移动时是纯复制、移动操作。本地是纯复制,HDFS是纯移动

    • Insert

    一般采用insert+select保存临时数据

    1. 需要保证查询结果列的数目和需要插入数据表格的列数目一致。
    2. 如果查询出来的数据类型和插入表格对应的列数据类型不一致,将会进行转换,但是不能保证转换一定成功,转换失败的数据将会为NULL。
    insert into table student_from_insert select num,name from student;
    • Select

      SELECT [ALL | DISTINCT] select_expr, select_expr, ...
      FROM table_reference
      [WHERE where_condition]
      [GROUP BY col_list]
      [ORDER BY col_list]
      [LIMIT [offset,] rows];
      • DISTINCT指定从结果集中删除重复的行。默认ALL
      • 在WHERE表达式中,可以使用Hive支持的任何函数和运算符,但聚合函数除外。
      • 在SQL中增加HAVING子句原因是,WHERE关键字无法与聚合函数一起使用。HAVING子句可以让我们筛选分组后的各组数据,并且可以在Having中使用聚合函数,因为此时where,group by已经执行结束,结果集已经确定。
      • HAVING和WHERE的区别

        • having是在分组后对数据进行过滤
        • where是在分组前对数据进行过滤
        • having后面可以使用聚合函数
        • where后面不可以使用聚合函数
      • oreder by 默认asc ,降序desc
      • limit可以接受1个或者两个参数(第一个参数指定要返回的第一行的偏移量第二个参数指定要返回的最大行数。当给出单个参数时,它代表最大行数,并且偏移量默认为0。)
      • 执行顺序:from > where > group(含聚合)> having >order > select;
    • join语法:

      • inner join 内连接

        #以下三者等价 即join=inner join=隐式连接
        joinselect e.id,e.name,e_a.city,e_a.street
        from employee e inner join employee_address e_a
        on e.id =e_a.id
        
        joinselect e.id,e.name,e_a.city,e_a.street
        from employee e join employee_address e_a
        on e.id =e_a.id
        
        select e.id,e.name,e_a.city,e_a.street
        from employee e , employee_address e_a
        where e.id =e_a.id;
      • left join:join时以左表的全部数据为准,右边与之关联;左表数据全部返回,右表关联上的显示返回,关联不上的显示null返回。
    • Hive常用函数:

      • 使用show functions查看当下可用的所有函数;通过describe function extended funcname来查看函数的使用方式。
      • Hive的函数分为两大类:内置函数(Built-in Functions)、用户定义函数UDF(User-Defined Functions):

        • 内置函数可分为:数值类型函数、日期类型函数、字符串类型函数、集合函数、条件函数等;
        • 用户定义函数根据输入输出的行数可分为3类:UDF、UDAF、UDTF。(其实内置函数也可以按照输入输出划分,现在弱化了UD(User-Defined))

          • UDF(User-Defined-Function)普通函数,一进一出
          • UDAF(User-Defined Aggregation Function)聚合函数,多进一出
          • UDTF(User-Defined Table-Generating Functions)表生成函数,一进多出

    实际案例

    ETL(Extract-Transform-Load)数据清洗问题

    • 存在空数据,非法数据,采用where过滤
    • 信息融合在一起 采用substr截取
    • 信息为一个字段,采用切割函数split
    • 将etl后数据报存到新表 create table as select