0
点赞
收藏
分享

微信扫一扫

数分实习踩坑笔记:Hive SQL

微笑沉默 2022-03-11 阅读 70

数分实习踩坑笔记:Hive SQL

数分实习中踩过的坑

记录一下数分实习中踩过的坑,好记性不如烂笔头,更何况我记性差到不能行,离职后能带走的也就只有自己的笔记经验和感受。

Hive SQL篇

  • union 和 union all 的区别
    1. union 对两个结果集进行并集操作,不包括重复行;且对结果排序。
    2. union all 对两个结果集进行并集操作,包括重复行;不对结果排序。

  • 去掉string中部分字符
    1. substring( 字段名, 起始位置,截取长度)
    注:截取长度可省略
    2. regexp_replace( 字段名, 被替换字符,替换字符)

  • count一定要distinct否则计数无意义 (当然也可以group by啦)
    关于两者性能之间的差别:
    1. distinct 空间换时间,当数据集中时效率高,离散时效率低。
    2. group by 时间换空间,当数据集中时效率低,离散时效率高。

  • 解析json字段
    get_json_object( 字段名,$表示json变量标识然后用 . 或 [] 读取对象或数组 )
    第二个参数具体要看要解析的json的结构是什么样的,然后再拆。
    我会用网上json解析(eg:菜鸟json在线解析)看清结构再拆。

  • 跑数前检查分区
    避免数还没产出就跑,区分清楚全量表和增量表

  • date_sub() date_add()很好用
    方便限定日期和分区统一一起改日期,第一个参数:日期,第二个参数:天数。

  • 窗口函数 很重要:
    <窗口函数> over (partition by <用于分组的列名>
    order by <用于排序的列名>)
    1. rank() 会有并列的排序,后面排序跳过已占用的,比如1114
    2. row_number()不考虑并列的问题,比如1234
    3. dense_rank()有并列的情况,不占用下一个名次位置,比如1112
    4. 还有其他聚合函数sum(), count(), avg(), min(), max()

  • 注意数据类型
    注意检查数据类型,如string的数字排序会错误,需转换类型后排序

  • 全量表和增量表
    全量表最近一个分区存的是全量的历史数据,取数可以选择最近分区
    增量表新分区存的是新增加的数据,比如取数需要取2月1号到3月1号的数据,那分区可以选择大于取数日期范围的数据,例如2.1到3.2,但具体范围大多少,要以具体需求进行考量。

  • concat() 和 concat_ws()拼接函数
    concat_ws 是 concat的 特殊形式 意为 CONCAT With Separator。
    当参数中有null,concat则为null(不管其他参数是不是null)
    concat_ws 会忽略null值,不会忽略其他参数。
    concat_ws 中分割值可以为其他参数,concat不行,只能为str。
    例如:concat(year,‘-’,month,‘-’,day)
    concat_ws(’-’, year, month, day)年-月-日拼起来

  • 用时间戳进行时区转化
    from_unixtime(unix_timestamp(date) + timezone * 3600)
    date实例: 2022-02-28 20:21:26
    timezone实例:-11
    乘以3600是为了转换成秒

  • 分位数函数
    percentile_approx(字段名, 想要看的分位数, 精度)
    例如:percentile_approx(grade, array(0.05,0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,0.95,0.97,0.99), 9999)

  • 日期转周数
    weekofyear(date) as weekno

  • 有条件计数,求和
    count(case when …… then …… end)
    sum(case when …… then …… end)

  • Hive中设置变量
    sql语句中直接用${var_name}调用

  • 处理null值
    nvl(字段名,替代值)
    例子:nvl(number,0)

  • 建临时表
    with 临时表名1 as( 建表逻辑 ),
    临时表名2 as( 建表逻辑 )

  • case when
    case when 条件一 then 值一
    when 条件二 then 值二 end as 新字段名

  • 转换日期格式
    to_date(time)

  • 表连接
    以left join,join为主,搞清楚

  • 当前日期时间
    ‘$[YYYY-MM-DD]’ 当前时间
    ‘$[YYYY-MM-DD - 2D]’ 当前时间减两天
    ‘$[YYYY-MM-DD-HH - 48H]’ 当前时间减48小时

  • 建表调度结构

create table if not exists 表名(
	--字段信息
	字段名1 数据类型 COMMENT ‘备注’
	name string COMMENT ‘姓名‘
	grade int COMMENT ‘成绩‘
	)
comment ‘整个表的备注‘
partitioned by(
 -- 调度根据什么进行分区分组,例如
 country string --国家
 , pt string -分区
)-- 设置信息,例如:不严格模式(可不限制跑数)
set hive.exec.dynamic.partition.mode = nonstrict

insert overwrite table 表名 partition (country_code, pt)

-- 常规select 语句
select …………
from …………
where …………
  • 时间取小时
    hour(time)
  • 不等于
    <> 或者 !=
  • 保留几位小数
    round(字段,小数点后几位)
  • 数据类型转换
    cast(字段名 as 数据类型)
  • coalesce()
    COALESCE是一个函数, (expression_1, expression_2, …,expression_n)依次参考各参数表达式,遇到非null值即停止并返回该值。如果所有的表达式都是空值,最终将返回一个空值
    eg: coalesce(name,0)
  • having语句
    由于where不能使用聚合函数,当需要聚合函数限定的时候可以使用having语句
    select……
    from……
    group by……
    having sum(grade) > 600
  • split()
    split(字段,分隔符号)
  • 行转列
    select……
    from……
    lateral view explode(需展开的字段名)table名 as 新字段名
    where……

excel篇

  • CSV文件改动会出错,下载完文件存为excel!!!不然改动完关闭文件,啥也不剩。
  • iferror(value,value_if_error)
  • vlookup(loopup_value, table_arry数据区域, col_index_num数据区域的第几列, 0精准查询 或 1模糊查询)
  • sumifs(实际求和区域,第一个条件区域,第一个条件值,第二个条件区域,第二个条件值……)有时可以相当于多条件查询的vlookup
  • 数据透视表要熟练运用

后续会继续更新

举报

相关推荐

0 条评论