Fork me on GitHub

数据基础学习—作业管理规范与说明

作业管理

术语解释

抽取作业:指将数据从数据源接入在到数据仓库的作业。

计算作业:指通过脚本逻辑实现对数据进行加工处理的作业。

推送作业:指将源端的数据推送目标系统的作业。

质量作业:指通过配置质量检查规则对数据质量进行监测的作业。

作业负责人:指负责创建作业管理作业的人员

下游作业负责人:指负责创建下游作业管理下游作业的人员

数据平台维护人员:指负责维护平台管控数据的人员

一、作业生命周期管理 重要

A、作业线上管理

B、作业线下管理

C、数据平台对于连续失败15天的作业进行强制下线处理

二、作业脚本开发规范

A、脚本命名

  • 脚本名称仅由小写字母,数字及下划线组成,且与该脚本生成的Hive目标表名一致。
  • 脚本名称最大长度30位,对于超长内容尽量以JD缩写代替,可参考《京东数科数据仓库高频词根术语表》文档命名。

B、脚本注释

  • 保持注释与代码行为完全一致。
  • Description(描述):描述脚本的作用,内容清晰易懂。
  • Creator(创建人)、Modified By(修改人):请使用京东邮箱,不允许填写中文名及各类简称。Modified By(修改人)、Modified Time (修改时间)及Modified Content (修改内容):新建脚本时留空;如为已线上脚本,则请仔细填写修改人、修改时间、修改内容信息。

C、SQL规范

  • 脚本由一个或多个SQL片段组合而成,串行完成处理任务。
  • SQL语句不能以注释开始,片段中的半角括号需要成对出现,否则脚本执行时将报错。
  • SQL关键字大写,并保持必要的缩进。
  • SQL中使用到的表名应显式的描述为“库表”.“表名”方式。
  • 脚本中不允许创建或者删除非临时表表,不允许出现truncate或者rename 语法
  • 临时表统一存放于tmp库中,命名方式如下所示:临时表:TMP_ODM_ACTV_BT_PLUS_PLANRELATION_S_D_T[X] 脚本名:ODM_ACTV_BT_PLUS_PLANRELATION_S_D.py 其中TMP为临时表前缀,T[X]为数字下标。当临时表使用完毕后,需在脚本的最后一个SQL片段中统一删除。
  • 脚本中不允许INSERT临时表和目标表以外的表。
  • 段裁剪(只查询业务处理需要的字段)
  • 分区裁剪(查询条件限定分区字段,对应的比较值要求是固定条件,不能使用表字段或者执行时取值函数)
  • 查询条件尽早过滤(关联条件前置为表过滤条件,空值过滤)
  • 关联表时关联条件使用表唯一字段(关联表数据提前去重,避免使用多对多关联;不同类型字段关联时转换成同类型关联,大小表关联时小表前置)
  • 关联表时倾斜数据可以使用map join
  • 需要多次查询的含数据日期以外查询条件的数据,创建临时表保存数据。
  • group by替代distinct
  • max(struct())替代rownumber()=1
  • muti-insert(一次查询结果插入多个表/分区)

三、如何作业部署规范

  规范一:同层级间作业不准互相依

  规范二:普通接入作业优先级为80,普通计算作业优先级为149,普通推送作业优先级为150,质量作业优先级170,重点作业优先级小于30

  • 注明任务名称 set mapreduce.job.name=jobname_cusname_seq; use xxdb;
  • 不允许CREATE/DROP非临时表,不允许TRUNCATE/RENAME
  • 不允许INSERT临时表和目标表以外的表

四、常用UDF函数

  UDF的全称为user-defined function,用户定义函数,为什么有它的存在呢?有的时候 你要写的查询无法轻松地使用Hive提供的内置函数来表示,通过写UDF,Hive就可以方便地插入用户写的处理代码并在查询中使用它们,相当于在HQL(Hive SQL)中自定义一些函数。

  Hive中有三种UDF:(普通)UDF、用户定义聚集函数(user-defined aggregate function,UDAF)、用户定义表生成函数(user-defined table-generating function,UDTF)。

  A、UDF操作作用于单个数据行,并且产生一个数据行作为输出。大多数函数都属于这一类(比如数学函数和字符串函数)。

  B、UDAF 接受多个输入数据行,并产生一个输出数据行。想COUNT和MAX这样的函数就是聚集函数。

  C、UDTF 操作作用于单个数据行,并且产生多个数据行——-一个表作为输出

  表格如下:

UDF名称 UDF介绍
sysdate 获取系统日期
changedate 日期函数
date_format 日期格式化
idNo_province 身份证查询所在省份
distanceCalculator 距离计算
IPExt ip地址信息获取
idcardnotrans 15位身份证转18位
rep_ascii 过滤特殊字符

五、SQL编写注意事项

  sql编写区,多个sql用分号分隔即可 在sql中可以使用大量的日期变量,例如: select * from {table1} where dt='{tx_date}'

  变量和别名一样,需要用{}括起来,日期变量的所有日期都是根据当前任务数据日期计算而来,如果当前的数据日期为:2017-10-09,则上述语句程序解析后,实际运行语句为: select * from tmp.tmp_a_payment_1 where dt='2017-10-09'

注意事项

  1. 字段裁剪(只查询业务处理需要的字段)
  2. 分区裁剪(查询条件限定分区字段,对应的比较值要求是固定条件,不能使用表字段或者执行时取值函数)
  3. 查询条件尽早过滤(关联条件前置为表过滤条件,空值过滤)
  4. 关联表时关联条件使用表唯一字段(关联表数据提前去重,避免使用多对多关联;不同类型字段关联时转换成同类型关联,大小表关联时小表前置)
  5. 关联表时倾斜数据可以使用map join
  6. 需要多次查询的含数据日期以外查询条件的数据,创建临时表保存数据
  7. group by替代distinct
  8. max(struct())替代rownumber()=1
  9. muti-insert(一次查询结果插入多个表/分区)

下面展示同样高亮的 代码片.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
// An highlighted block
# SQL
sql=""" select
case when count(1)<>0 then "CHECK_OK"
else 'CHECK_FAILED'
end pop_info_flag
from app.a_01_pop_info_basic where dt='{tx_date}';
"""

sql_task = SqlTask()
sql_task.set_sql_runner(RUNNER_SPARK_SQL)
sql_task.set_sql(sql)
return_code = sql_task.execute()
sys.exit(return_code)
-------------本文结束感谢您的阅读-------------
大 吉 大 利!