Spark实战(6)_spark-sql -e -f -i命令的整合和spark-sql日常作业开发流程总结

背景介绍

在日常工作中,我们可以在一个shell脚本里面利用spark-sql -e执行sql脚本,而且可以传参数,但是存在一个问题,shell脚本对格式要求严格,而且shell脚本和spark-sql的脚本混在一起,内容庞大凌乱,不好管理。而spark-sql -f可以执行一个hql文件,但是不能传参数进去,这就引出了一个问题,有没有一种方法,既可以把shell和hql脚本分开,shell负责调度hql脚本,并且可以在shell中把参数传递到hql中,hql脚本文件只负责写hql。

sparkF功能开发的思路

开发一个sparkF的功能,用法同spark-sql -f,但支持传参,使用格式:

  • sparkF aa.sql
  • sparkF aa.sql -date 2015-01-02
  • sparkF aa.sql -date 2015-01-02 -date1 2015-01-03

其中,aa.sql里通过${date}的方式对接替换为想传递的参数值。

sparkF开发思路

最终的使用方式,sparkF aa.sql -date 2015-01-02

  • 开发一个Java应用程序读出aa.sql内容存入一个String变量里。
  • 把里面的${date}替换为2015-01-02,并System.out.println出来。
  • 在shell脚本里,用str接收System.out.println的输出,执行spark-sql -e $str
1cd /export/project
2mkdir bin
3cd bin
4touch sparkF

难点,把Java程序的输出结果直接放到shell脚本里运行

例如,运行sparkF aa.sql -date 2015-01-02

首先,Java运行jar,把参数传进来,shell脚本里$*接收参数。参数是哪里传的呢?哪里传给sparkF的呢?是shell脚本aa.sh传过来的,sparkF ./aa.sql -dt $yestoday,交给java来处理,把sql脚本里的占位参数替换为传递的参数值后,打印的str由cmd来接收,再用spark-sql -e执行。

1#!/bin/sh
2. /etc/profile
3cmd=`java -jar /export/project/lib/SparkF.jar $*`
4echo $cmd
5spark-sql -e "$cmd" -i /export/project/bin/init.hql

/export/project/lib/sparkF.jar,路径可以不写死,可以给它配一个环境变量。

/export/project/bin/init.hql,作为一个公共的UDF文件,在sparkF中通过spark-sql -i /export/project/bin/init.hql调用,在-e执行之前,用-i进行初始化。

1chmod +x hiveF
1# 加入环境变量
2vi /etc/profile
3export PATH=$PATH:/export/project/bin
4source /etc/profile

添加maven插件,打包SparkF.jar。

 1<plugin>
 2    <artifactId>maven-assembly-plugin</artifactId>
 3    <configuration>
 4        <descriptorRefs>
 5            <descriptorRef>jar-with-dependencies</descriptorRef>
 6        </descriptorRefs>
 7        <archive>
 8            <manifestFile>src/main/resources/META-INF/MANIFEST.MF</manifestFile>
 9        </archive>
10    </configuration>
11    <executions>
12        <execution>
13            <id>make-assembly</id>
14            <phase>package</phase>
15            <goals>
16                <goal>single</goal>
17            </goals>
18        </execution>
19    </executions>
20</plugin>

执行验证结果,

1sh /export/project/fct_session_info/fct_session_info.sh 2015-08-28

spark-sql日常作业开发流程

sparkF aa.hql -date 2015-01-02为例,

在aa.hql脚本中编写业务逻辑处理脚本,如果有参数,假设参数是dt,在脚本中用{dt}占位符代替(取决于开发SparkF.jar时的定义),然后通过aa.sh调度aa.hql,如sh aa.sh $yestoday,并且在aa.sh中利用我们开发的sparkF的功能,如sparkF ./aa.hql -dt $yestoday

这样,可以实现hql业务处理逻辑和shell脚本分离,并且可以把自定义的UDF统一放在一个hql文件中统一管理,在sparkF命令中通过spark -i init.hql统一引用。如:

1add jar /export/project/lib/hive_udf.jar ;
2create temporary function GetActID as 'com.padluo.hive.udf.GetActID';

本文首发于steem,感谢阅读,转载请注明。

https://steemit.com/@padluo


微信公众号「padluo」,分享数据科学家的自我修养,既然遇见,不如一起成长。



读者交流电报群

https://t.me/sspadluo


知识星球交流群


  • 0
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值