看懂Hive的执行计划

官方文档
https://cwiki.apache.org/confluence/display/Hive/LanguageManual+Explain

关于Hive执行计划简述

一般执行计划有两个部分:
stage dependencies 各个stage之间的依赖性
stage plan 各个stage的执行计划

一个stage并不一定是一个MR,有可能是Fetch Operator,也有可能是Move Operator。

一个MR的执行计划分为两个部分:
Map Operator Tree MAP端的执行计划
Reduce Operator Tree Reduce端的执行计划

一些常见的Operator:
TableScan 读取数据,常见的属性 alias

Select Operator 选取操作
Group By Operator 分组聚合, 常见的属性 aggregations、mode , 当没有keys属性时只有一个分组。
Reduce Output Operator 输出结果给Reduce , 常见的属性 sort order
Fetch Operator 客户端获取数据 , 常见属性 limit

常见的属性的取值及含义:
aggregations 用在Group By Operator中
count()计数

mode 用在Group By Operator中
hash 待定
mergepartial 合并部分聚合结果
final

sort order 用于Reduce Output Operator中
+ 正序排序
不排序
++按两列正序排序,如果有两列
+- 正反排序,如果有两列
-反向排序
如此类推

下面是一些典型的操作的执行计划

先看一个简单的执行计划

hive> explain select count(*) from t_data1 ;

STAGE DEPENDENCIES:
  Stage-1 is a root stage
  Stage-0 depends on stages: Stage-1
#说明stage之间的依赖性

STAGE PLANS:  #各个stage的执行计划
  Stage: Stage-1
    Map Reduce  #这个stage是一个MR
      Map Operator Tree:  #Map阶段的操作树
          TableScan  #扫描表,获取数据
            alias: t_data1  扫描的表别名
            Statistics: Num rows: 1 Data size: 43835224 Basic stats: COMPLETE Column stats: COMPLETE
            Select Operator  #选取操作
              Statistics: Num rows: 1 Data size: 43835224 Basic stats: COMPLETE Column stats: COMPLETE
              Group By Operator   #分组聚合操作,不指定Key,只有一个分组
                aggregations: count()  聚合操作
                mode: hash    模式?    
                outputColumnNames: _col0  输出列名
                Statistics: Num rows: 1 Data size: 8 Basic stats: COMPLETE Column stats: COMPLETE
                Reduce Output Operator   #输出结果给Reduce
                  sort order:         #不排序
                  Statistics: Num rows: 1 Data size: 8 Basic stats: COMPLETE Column stats: COMPLETE
                  value expressions: _col0 (type: bigint)   #value表达式
      Reduce Operator Tree:   #Reduce的操作树
        Group By Operator    #分组聚合操作
          aggregations: count(VALUE._col0)   聚合操作
          mode: mergepartial      合并各个map所贡献的各部分
          outputColumnNames: _col0
          Statistics: Num rows: 1 Data size: 8 Basic stats: COMPLETE Column stats: COMPLETE
          File Output Operator   #文件输出操作
            compressed: false    不压缩
            Statistics: Num rows: 1 Data size: 8 Basic stats: COMPLETE Column stats: COMPLETE
            table:
                input format: org.apache.hadoop.mapred.TextInputFormat
                output format: org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat
                serde: org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe

  Stage: Stage-0   #依赖于Stage1的stage0
    Fetch Operator  #获取数据操作
      limit: -1     #不限定
      Processor Tree:  
        ListSink

这是一个简单的count(*)的执行计划

再来看一个count(distinct)的执行计划

hive> explain select count(distinct sid) from t_data1 ;

STAGE DEPENDENCIES:
  Stage-1 is a root stage
  Stage-0 depends on stages: Stage-1

STAGE PLANS:
  Stage: Stage-1
    Map Reduce
      Map Operator Tree:
          TableScan
            alias: t_data1
            Statistics: Num rows: 5479403 Data size: 43835224 Basic stats: COMPLETE Column stats: NONE
            Select Operator
              expressions: sid (type: bigint)  #选取SID
              outputColumnNames: sid
              Statistics: Num rows: 5479403 Data size: 43835224 Basic stats: COMPLETE Column stats: NONE
              Group By Operator   #分组聚合操作
                aggregations: count(DISTINCT sid)  #聚合算子
                keys: sid (type: bigint)   #分组键
                mode: hash
                outputColumnNames: _col0, _col1
                Statistics: Num rows: 5479403 Data size: 43835224 Basic stats: COMPLETE Column stats: NONE
                Reduce Output Operator  #输出到Reduce
                  key expressions: _col0 (type: bigint)  #键表达式
                  sort order: +     #正向排序
                  Statistics: Num rows: 5479403 Data size: 43835224 Basic stats: COMPLETE Column stats: NONE
      Reduce Operator Tree:  
        Group By Operator   #分组聚合操作
          aggregations: count(DISTINCT KEY._col0:0._col0)
          mode: mergepartial   #合并各个部分聚合结果
          outputColumnNames: _col0
          Statistics: Num rows: 1 Data size: 16 Basic stats: COMPLETE Column stats: NONE
          File Output Operator
            compressed: false
            Statistics: Num rows: 1 Data size: 16 Basic stats: COMPLETE Column stats: NONE
            table:
                input format: org.apache.hadoop.mapred.TextInputFormat
                output format: org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat
                serde: org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe

  Stage: Stage-0
    Fetch Operator
      limit: -1
      Processor Tree:
        ListSink

分组聚合的例子

explain select applove_date , count(*) from t_data1 group by applove_date ;

STAGE DEPENDENCIES:
  Stage-1 is a root stage
  Stage-0 depends on stages: Stage-1

STAGE PLANS:
  Stage: Stage-1
    Map Reduce
      Map Operator Tree:
          TableScan
            alias: t_data1
            Statistics: Num rows: 1095880 Data size: 43835224 Basic stats: COMPLETE Column stats: NONE
            Sele
<think>好的,用户之前让我介绍了Sqoop的使用,现在他给出新的请求:“给出注释,我看不懂”。我需要先理解用户的具体需求。用户之前已经得到了Sqoop的使用说明,但可能在实际操作中遇到了问题,或者对之前提供的代码示例中的某些部分不理解,需要更详细的注释来解释每个参数或命令的作用。 首先,回顾之前的回答,我提供了Sqoop的安装、核心命令、关键参数、注意事项和应用场景。用户现在可能是在执行这些命令时,对具体的参数或语法有疑问,导致无法正确使用Sqoop。例如,用户可能不明白`--target-dir`的作用,或者对增量导入的参数`--incremental append`不太清楚。 接下来,我需要考虑用户可能的身份和使用场景。用户可能是刚开始接触Sqoop的数据工程师或大数据开发者,对命令行工具的使用还不够熟悉,或者对参数的具体含义需要进一步解释。用户的需求是希望每个命令的参数都有注释,以便理解每个部分的作用,从而能够正确使用Sqoop进行数据导入导出。 此外,用户可能没有明确说明是哪个部分的注释,所以需要确保覆盖所有之前提到的命令和参数。可能需要将之前的示例代码拆解,逐行或逐参数进行解释,帮助用户理解每个选项的意义和用法。 还需要检查之前的回答是否存在不够清晰的地方。例如,在导入到Hive时使用了`--hive-import`和`--create-hive-table`,用户可能不清楚这两个参数的区别,或者为什么需要同时使用。此外,关于并行控制中的`-m`参数和`--split-by`的关系,可能需要更详细的解释,说明如何选择分片字段以及并行任务数的影响。 同时,用户可能对密码安全的部分感兴趣,比如如何使用`-P`参数从文件读取密码,而不仅仅是命令行输入,这在实际生产环境中更为安全,但用户可能不知道具体如何操作,需要补充示例。 另外,数据类型映射和空值处理的部分,用户可能在实践中遇到数据转换的问题,例如数据库中的NULL值在导入到Hive时如何处理,需要更详细的注释说明如何配置这些参数以避免错误。 最后,需要确保注释清晰易懂,使用中文,并且结构合理,帮助用户逐步理解每个参数的作用,从而能够独立解决问题。可能还需要提醒用户注意版本差异,尤其是Sqoop 1和Sqoop 2的不同,避免混淆。</think>以下是针对Sqoop常用命令的**逐行注释说明**,帮助理解参数含义和使用场景: --- ### **示例1:基础导入(MySQL → HDFS)** ```bash sqoop import \ # 启动数据导入任务 --connect jdbc:mysql://host/dbname \ # 数据库连接URL(host=IP/域名,dbname=数据库名) --username root \ # 数据库登录用户名 --password 123456 \ # 数据库密码(生产环境建议用-P从文件读取) --table employees \ # 要导出的源表名 --target-dir /user/hadoop/employees \ # HDFS目标路径(自动创建目录) --fields-terminated-by ',' \ # 指定字段分隔符(默认逗号) -m 4 # 并行任务数(需配合--split-by字段分割数据) ``` --- ### **示例2:增量导入(仅追加新数据)** ```bash sqoop import \ --connect jdbc:mysql://host/dbname \ --username root \ --password 123456 \ --table orders \ --check-column order_date \ # 用于检测增量的字段(必须是数字或时间类型) --incremental append \ # 增量模式(append=追加,lastmodified=时间戳更新) --last-value "2023-10-01" \ # 上次导入的最后值(下次运行时需更新此值) --target-dir /user/hadoop/orders_new ``` --- ### **示例3:导入到Hive并自动建表** ```bash sqoop import \ --connect jdbc:mysql://host/dbname \ --username root \ --password 123456 \ --table products \ --hive-import \ # 指定导入到Hive(默认使用Hive元数据格式) --create-hive-table \ # 自动创建Hive表(若表已存在会报错) --hive-database sales_db \ # 指定Hive数据库(默认用default库) --hive-table product_info \ # Hive表名(可与原表名不同) --null-string '\\N' \ # 将字符串空值转为Hive的NULL(需转义符) --null-non-string '\\N' # 将非字符串空值(如数字)转为NULL ``` --- ### **示例4:条件过滤与列选择** ```bash sqoop import \ --connect jdbc:mysql://host/dbname \ --username root \ --password 123456 \ --query "SELECT id,name,age FROM users WHERE age > 25 AND \$CONDITIONS" \ # 自定义SQL查询(必须包含\$CONDITIONS占位符) --split-by id \ # 指定分片字段(需是查询结果中的字段) --target-dir /user/hadoop/adult_users ``` --- ### **示例5:导出HDFS数据到MySQL** ```bash sqoop export \ --connect jdbc:mysql://host/dbname \ --username root \ --password 123456 \ --export-dir /user/hive/warehouse/sales \ # HDFS源数据路径 --table db_sales \ # 目标数据库表名(需提前建表) --input-fields-terminated-by '\t' \ # 指定HDFS数据的分隔符(需与数据实际格式一致) --update-key id \ # 根据id字段更新已有记录(若未匹配则插入新数据) --update-mode allowinsert # 混合模式(更新+插入) ``` --- ### **关键参数说明表** | 参数 | 用途 | 注意事项 | |------|------|----------| | `--direct` | 使用数据库原生工具加速传输(如MySQL的`mysqldump`) | 仅支持部分数据库 | | `--compress` | 启用数据压缩(默认GZIP) | 减少网络传输量,但增加CPU消耗 | | `--map-column-hive` | 强制指定Hive列类型(如`--map-column-hive age=INT`) | 解决自动类型映射错误问题 | | `--staging-table` | 指定临时表(避免导出时污染目标表) | 需手动清理临时表 | --- ### **常见问题解答** 1. **`$CONDITIONS`是什么?** Sqoop自动生成的查询条件,用于并行任务分割数据(例如`id BETWEEN 1 AND 1000`)。 2. **如何避免密码泄露?** 使用`-P`参数从文件读取密码: ```bash echo -n "123456" > .password # 创建密码文件 sqoop import ... --password-file file://$(pwd)/.password ``` 3. **字段类型映射错误怎么办?** 通过`--map-column-java`或`--map-column-hive`手动指定类型: ```bash --map-column-java create_time=String,price=Double ``` --- 通过以上注释和示例,可以更清晰地理解Sqoop参数的使用逻辑。遇到具体问题时可运行 `sqoop help [命令]` 查看官方文档(例如 `sqoop help import`)。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值