一、临时数据方案

1、with as

1.1 使用demo

with t1 as (

    select

        imei

        ,src_pkg

        ,src_type

        ,app_version_name

    from bi_quickgame.dw_qgcrpk_boot_di

    where day '${etl_date}'

    group by

        imei, src_pkg, src_type, app_version_name

)

1.2 with as 执行分析

执行sql :

EXPLAIN

with as(

select regexp_replace(reflect("java.util.UUID""randomUUID"), "-"""AS id --生成一个随机id

,'zengkun' as name

)

select from t

union all

select from t

;

拓展:hive  reflect  介绍:hive新特性reflect函数介绍 - hustzzl - 博客园

执行结果:

产生2个id

总结:结果中可以看到,产生了两个不一样的id,说明reflect函数被执行了两次,即with as中的子查询被执行了两次

查看执行路径:

Explain

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: _dummy_table

            Row Limit Per Split: 1

            Statistics: Num rows: 1 Data size: 1 Basic stats: COMPLETE Column stats: COMPLETE

            Select Operator

              expressions: regexp_replace(reflect('java.util.UUID','randomUUID'), '-', '') (type: string), 'zengkun' (type: string)

              outputColumnNames: _col0, _col1

              Statistics: Num rows: 1 Data size: 1 Basic stats: COMPLETE Column stats: COMPLETE

              Union

                Statistics: Num rows: 2 Data size: 2 Basic stats: COMPLETE Column stats: COMPLETE

                File Output Operator

                  compressed: false

                  Statistics: Num rows: 2 Data size: 2 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

          TableScan

            alias: _dummy_table

            Row Limit Per Split: 1

            Statistics: Num rows: 1 Data size: 1 Basic stats: COMPLETE Column stats: COMPLETE

            Select Operator

              expressions: regexp_replace(reflect('java.util.UUID','randomUUID'), '-', '') (type: string), 'zengkun' (type: string)

              outputColumnNames: _col0, _col1

              Statistics: Num rows: 1 Data size: 1 Basic stats: COMPLETE Column stats: COMPLETE

              Union

                Statistics: Num rows: 2 Data size: 2 Basic stats: COMPLETE Column stats: COMPLETE

                File Output Operator

                  compressed: false

                  Statistics: Num rows: 2 Data size: 2 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

    Fetch Operator

      limit: -1

      Processor Tree:

        ListSink

总结: TableScan 了两次,并且是相同的两次

1.3 with as 执行总结

with as 不会减少表的扫描,一个任务中重复使用会执行多次(可以简单理解with AS 生成了个视图)

2、CREATE TEMPORARY TABLE 创建临时表

2.1 使用demo

-- 获取所有除曝光的所有埋点

create temporary table bi_gamecenter_dev.tmp_da_gc_origin_event_di_1 as

select

    t.*

from bi_gamecenter_dev.dw_gc_oprt_log_h t

where day  '${etl_date}'

and not (  --delete the exposure data

     action '/clientRequest/userOperationLog'

     and (

        fields['exposure_stat'is not null

        or fields['appexpo'is not null

        or fields['search_exposure'is not null

        or fields['exposure'is not null

     )

);

2.2 TEMPORARY TABLE 介绍

Hive从0.14.0开始提供创建临时表的功能,表只对当前session有效,session退出后,表自动删除

创建的临时表仅仅在当前会话是可见的,数据将会被存储在用户的暂存目录中,并在会话结束时被删除。如果创建临时表的名字与当前数据库下的一个非临时表相同,则在这个会话中使用这个表名字时将会使用的临时表,而不是非临时表,用户在这个会话内将不能使用原表,除非删除或者重命名临时表。

临时表有如下限制:

  1. 不支持分区字段
  2. 不支持创建索引
  3. 在Hive1.1.0之后临时表可以存储到memory,ssd或者default中,可以通过配置 hive.exec.temporary.table.storage来实现

3、创建真实表作为临时表

直接创建真是表,并且落地hdfs,每次使用过后删除

使用demo:

-- 前天排行榜访问数据

drop table IF EXISTS bi_gamecenter_dev.tmp_gc_board_exposure_1_${etl_datekey};

create table bi_gamecenter_dev.tmp_gc_board_exposure_1_${etl_datekey} as

select --曝光

    origin_event as origin,

    app_version_code,

    imei

from

    bi_gamecenter_dev.dw_gc_exposure_log_d

where day = date_sub('${etl_date}',1) 

and   origin_event in ('530','531','532','533')

-- 过风控

and risk_flag = 0

;

drop table IF EXISTS bi_gamecenter_dev.tmp_gc_board_exposure_1_${etl_datekey};

二、临时表方式对比

临时表大概三种临时表,进行横向对比

临时表方法

优点

缺点

使用注意

with as

1.使用方便,无需关注结果数据内容。

2.写法简易,不需要建表,直接使用即可

3.可读性强

1.如果多次使用,会多次scan表,降低效率

2.数据自查的时候,不容易定位问题

如果多次使用,会多次scan表!
create temporary table

1.使用较为方便,单个进程中存在,自动删除。

2.具备复用性,在相同任务中,重复使用结果。

1.任务结束既删除,不方便过程数据校验。

2.无法创建分区表,只能简单创建临时表。

create table

1.直接创建真实表,并且落地hdfs,方便过程数据校验。

2.可以创建分区临时表等操作,丰富临时表。

1.使用不方便,每次需要先drop再create,完成后再drop。

记得给临时表带参数,方便任务回滚!

总结:

目前使用的三种方式各有优劣,需要在对应场景使用。

Hive--临时表的三种方式相关推荐

  1. Hive启动的三种方式

    方式1 配置了环境变量可以直接启动 hive 方式2 进入后台启动 hive --service hiveserver2 & 特点: 可以单独启动此服务进程,供远程客户端连接:此服务内置met ...

  2. hive安装测试及Hive 元数据的三种存储方式

    一  hive安装测试 1.下载解压 tar -xf hive-x.y.z.tar.gz(本次安装为hive-0.8.1.tar.gz) 将解压后的hive-0.8.1文件放在系统的/home/had ...

  3. 061 hive中的三种join与数据倾斜

    一:hive中的三种join 1.map join 应用场景:小表join大表 一:设置mapjoin的方式: )如果有一张表是小表,小表将自动执行map join. 默认是true. <pro ...

  4. 【大数据开发】SparkCore——进阶算子、Action算子、查看分区数的三种方式

    源代码中的大写V,指的是value rdd.getNumberPartitions获取分区数量 Transformation算⼦全都是RDD[U,T]类型的 Action算子的返回值一般情况下不会是R ...

  5. ajax上传多文件和数据,Ajax上传数据和上传文件(三种方式)

    Ajax向后端发送数据可以有三种方式:原生Ajax方式,jQuery Ajax方式,iframe+form 方式(伪造Ajax方式) Title .btn { background-color: co ...

  6. 远程控制virtual box虚拟机系统的三种方式

    远程控制virtual box虚拟机系统的三种方式[阅读时间:5分钟] 1.使用现有的远程控制软件 2.使用SSH连接 3.使用远程桌面控制虚拟机系统 对于把虚拟机安装在寝室笔记本的人来说,能够远程控 ...

  7. 命令行运行Python脚本时传入参数的三种方式

    三种常用的方式 如果在运行python脚本时需要传入一些参数,例如gpus与batch_size,可以使用如下三种方式. python script.py 0,1,2 10 python script ...

  8. sass文件编译的三种方式【舒】

    [舒:]sass文件编译的三种方式 方式一: 1.webstorm打开evtGulp项目或者mcake-activity项目 2.中,开启gulp->default/develop,启动watc ...

  9. java多线程w3c_Java创建多线程的三种方式

    前言 这篇文章主要讲述线程的概念.组成.Java创建多线程的三种方式以及线程的类型. 线程概念 线程和进程的区别 **进程:**正在运行的程序,例如:你打开 的qq音乐.exe程序,其由PCB(进程控 ...

最新文章

  1. 构建一个运行在Azure虚拟机上的MySQL Spring Boot应用程序
  2. CentOS 6.x使用yum快速安装MySQL 5.5
  3. 详解keepalived配置和使用
  4. java调用net_Java调用C#.net开发的WebService
  5. extern C的用法解析
  6. Matlab | Matlab从入门到放弃(13)——基于Matlab的非线性函数的运算
  7. linux 删除in链接,linux - 从TCP_IN删除端口不会从CSF上的外部流量关闭它 - 堆栈内存溢出...
  8. Android学习笔记---常用技巧(图片的旋转)
  9. 华农c语言期末试卷答案,华南农业大学2013学年第1学期程序设计(C语言)期末考试试卷(A卷)...
  10. 小程序----API
  11. mac上SCRT中文变问号的处理方式,亲测有效
  12. flash移植到android上,Flash Web Game移植到Android平台需要注意的地方
  13. Codeforces Round #612 (Div. 1) A. Garland(dp动态规划)
  14. excel表格怎么打印?来看看excel表格打印的正确打开方式
  15. Rtools 环境变量设置-windows
  16. java第九章第一题_Java第九章第五题
  17. sja1000 中断_[转载]SJA1000的错误中断处理
  18. 绿联扩展坞拆解_绿联最新豪华版3A1C四口多功能扩展坞深度拆解,用料满满
  19. 《互联网信贷风险与大数据》读书笔记(一)
  20. python中错误TypeError: __init__() got an unexpected keyword argument 'shape'

热门文章

  1. 数字信号处理——Chirp Z变换
  2. Bagging 和随机森林
  3. Python对Excle判断每一行值情况
  4. 内存测试软件苹果手机,苹果6内存问题,怎么查看iPhone6Plus的闪存内存类型(不用越狱)...
  5. netflix会员和非会员的区别_Netflix会员低价购买方法
  6. 采用Net::OICQ编写qq暴力破解程序
  7. ant design vue 中Notification隐藏右上角叉号
  8. mysql 创建外键
  9. 【python做接口测试的学习记录day10——pytest自动化测试框架之接口加密】
  10. 高效钉钉小程序开发丨Hello,dingtalk