oozie + hue 执行 SQL脚本、SQL 脚本中传入参数 ${partdt} 的使用

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zimiao552147572/article/details/88427112

================= oozie + hue 执行 SQL脚本 =====================

1.三种方式把 结构化数据的文件 存到 数据库表中:方式一 和 方式二 作用相同
            1.方式一:把 linux的结构化数据的文件 存到 hdfs文件系统目录下的某表中
                格式:LOAD DATA local INPATH 'linux本地的结构化数据文件所在的绝对路径' [overwrite] INTO TABLE 表名;
                属性解析:
                    1.有LOCAL 表示从本地文件系统加载(文件会被拷贝到HDFS中)
                    2.无LOCAL 表示从HDFS中加载数据(注意:文件直接被移动,而不是拷贝,并且文件名都不带改的)
                    3.没有OVERWRITE 会直接APPEND,有OVERWRITE 表示是否覆盖表中数据(或指定分区的数据)

            2.方式二:把 linux本地的结构化数据的文件 存到 hdfs文件系统目录下的某表中
                把 linux的结构化数据的文件 存到 hdfs文件系统目录下的 “/user/hive/warehouse/数据库名.db/表名”的文件夹中,相当于存到 数据库表中,
                格式:hadoop fs -put  linux本地的结构化数据文件所在路径  hdfs文件系统中“表”所在路径
                            hadoop fs -put /root/结构化数据文件名 /user/hive/warehouse/数据库名.db/表名    
                例子:hadoop fs -put /root/1.txt /user/hive/warehouse/rimengshe.db/nagisa


            3.方式三:
                把 hdfs中文件夹中所有数据文件 导入到 某hive表中 或 某分区的hive中
                格式一:load data inpath 'hdfs文件系统下绝对路径' [overwrite] into table 表名 partition(分区字段名='分区字段值');
                格式二:load data inpath 'hdfs文件系统下绝对路径' [overwrite] into table 表名;
                例子:load data inpath '/weblog/preprocessed/' overwrite into table ods_weblog_origin partition(datestr='20130918');
                属性解析:
                    1.有LOCAL 表示从本地文件系统加载(文件会被拷贝到HDFS中)
                    2.无LOCAL 表示从HDFS中加载数据(注意:文件直接被移动,而不是拷贝,并且文件名都不带改的)
                    3.没有OVERWRITE 会直接APPEND,有OVERWRITE 表示是否覆盖表中数据(或指定分区的数据)
 
2.LOAD DATA LOCAL INPATH 在 oozie+hue的定时执行的 hiveserver环境下 的使用注意事项:
    执行:LOAD DATA LOCAL INPATH 'linux中文件所在的绝对路径' into table bdm.itcast_bdm_user partition(dt=xxx);
    报错:Invalid path ''linux中文件所在的绝对路径'': No files matching path file:linux中文件所在的绝对路径
    分析:linux中文件所在的绝对路径下的确存在该文件的,但是仍然报错说匹配不到该路径下的文件
    原因:
        hive导入数据语句 load data [local] inpath 是一个服务器端的指令,它是在服务器端执行。
        因此指定local时表明加载的文件为linux本地文件,但是这里的local,在hive中指的是 hiveserver 服务所在的机器,
        而不是hivecli 或 beeline客户端所在的机器(生产环境大都是 hiveserver,而和 hivecli不在同一个机器)。
        本来LOCAL 是在指定的linux文件系统路径下找文件的,但因为当前是在oozie + hue 定时执行 SQL脚本的话,那么LOCAL 代表了是在 hiveserver服务所在的机器,
        而不在hivecli 或 beeline客户端所在的机器,因此反而变成无法到linux文件系统路径下找文件,变成是hiveserver服务所在的机器路径下找文件,
        此处所说的hiveserver服务所在的机器指的是Hadoop环境下的路径。
    解决:
        方法一:把要加载的文件上传到 hiveserver所在的服务器(这一般是不可能的事情),然后执行 load data local inpath [path] [overwrite] into table table_name.
        方法二:先将本地文件上传至hdfs,然后使用 load data inpath [hdfspath] [overwrite] into table table_name.
 
    此处使用的解决方案为方法二:LOAD DATA INPATH '/user/hivaData/itcast_bdm_user.txt' into table bdm.itcast_bdm_user partition(dt=${partdt});

3.调度传入的时间参数值:
    ${beforeTwoDay} 前天的日期就可以写为前天日期:${coord:formatTime(coord:dateOffset(coord:nominalTime(), -2, 'DAY'), 'yyyyMMdd')}
    ${partdt} 昨天的日期就可以写为昨天日期:${coord:formatTime(coord:dateOffset(coord:nominalTime(), -1, 'DAY'), 'yyyyMMdd')}
    ${partdt} 当前今天的日期就可以写为当前今天日期:${coord:formatTime(coord:dateOffset(coord:nominalTime(), 0, 'DAY'), 'yyyyMMdd')}


4.hive:
    beeline -u jdbc:hive2://node1:10000 -n root
    show databases; 显示 bdm、fdm、gdm 
        BDM 层(源数据层):缓冲数据,源数据的直接映射
        FDM 层(对 BDM 源数据层的数据进行清洗和预处理):基础数据层,数据拉链处理、分区处理
        GDM 层(对 FDM 层数据 进行统计一些指标数据):通用聚合
        ADM 层(对 GDM 层指标数据 进行指标数据的业务汇总分析):高度聚合
    use bdm;
    show tables;
    select * from itcast_bdm_user;

    use fdm;
    show tables;
    select * from itcast_fdm_user_wide;
 
    use gdm;
    show tables;
    select * from itcast_gdm_user_basic;

======== SQL 脚本中传入参数 ${partdt} 的使用 =============

${partdt} 不加上 字符串 的情况:
    1.日期时间比较:order_date <= ${partdt}
    2.作为过滤条件中的日期时间:WHERE dt = ${partdt}

${partdt} 要加上 字符串 的情况:
    1.在操作时间日期的函数中:order_date >= DATE_SUB('${partdt}', 59)
                    DATEDIFF(MAX(a.order_date), '${partdt}') 

oozie常用的系统常量
常量表示形式                        含义说明
${coord:minutes(int n)}                返回日期时间:从一开始,周期执行n分钟
${coord:hours(int n)}                返回日期时间:从一开始,周期执行n * 60分钟
${coord:days(int n)}                返回日期时间:从一开始,周期执行n * 24 * 60分钟
${coord:months(int n)}                返回日期时间:从一开始,周期执行n * M * 24 * 60分钟(M表示一个月的天数)
${coord:endOfDays(int n)}                返回日期时间:从当天的最晚时间(即下一天)开始,周期执行n * 24 * 60分钟
${coord:endOfMonths(1)}                返回日期时间:从当月的最晚时间开始(即下个月初),周期执行n * 24 * 60分钟
${coord:current(int n)}                返回日期时间:从一个Coordinator动作(Action)创建时开始计算,第n个dataset实例执行时间
${coord:dataIn(String name)}            在输入事件(input-events)中,解析dataset实例包含的所有的URI
${coord:dataOut(String name)}            在输出事件(output-events)中,解析dataset实例包含的所有的URI
${coord:offset(int n, String timeUnit)}        表示时间偏移,如果一个Coordinator动作创建时间为T,n为正数表示向时刻T之后偏移,n为负数向向时刻T之前偏移,
                        timeUnit表示时间单位(选项有MINUTE、HOUR、DAY、MONTH、YEAR)
${coord:hoursInDay(int n)}                指定的第n天的小时数,n>0表示向后数第n天的小时数,n=0表示当天小时数,n<0表示向前数第n天的小时数
${coord:daysInMonth(int n)}            指定的第n个月的天数,n>0表示向后数第n个月的天数,n=0表示当月的天数,n<0表示向前数第n个月的天数
${coord:tzOffset()}                ataset对应的时区与Coordinator Job的时区所差的分钟数
${coord:latest(int n)}                最近以来,当前可以用的第n个dataset实例
${coord:future(int n, int limit)}            当前时间之后的dataset实例,n>=0,当n=0时表示立即可用的dataset实例,limit表示dataset实例的个数
${coord:nominalTime()}                nominal时间等于Coordinator Job启动时间,加上多个Coordinator Job的频率所得到的日期时间。
                        例如:start=”2009-01-01T24:00Z”,end=”2009-12-31T24:00Z”,frequency=”${coord:days(1)}”,
                              frequency=”${coord:days(1)},则nominal时间为:2009-01-02T00:00Z、2009-01-03T00:00Z、2009-01-04T00:00Z、…、
                              2010-01-01T00:00Z
${coord:actualTime()}                Coordinator动作的实际创建时间。例如:start=”2011-05-01T24:00Z”,end=”2011-12-31T24:00Z”,
                        frequency=”${coord:days(1)}”,则实际时间为:2011-05-01,2011-05-02,2011-05-03,…,2011-12-31
${coord:user()}                            启动当前Coordinator Job的用户名称
${coord:dateOffset(String baseDate, int instance, String timeUnit)}    计算新的日期时间的公式:newDate = baseDate + instance * timeUnit,
                                如:baseDate=’2009-01-01T00:00Z’,instance=’2′,timeUnit=’MONTH’,
                                则计算得到的新的日期时间为’2009-03-01T00:00Z’。
${coord:formatTime(String timeStamp, String format)}            格式化时间字符串,format指定模式

猜你喜欢

转载自blog.csdn.net/zimiao552147572/article/details/88427112