天天看点

sparkcli命令spark-sql的使用

spark的定位是是替换掉hive和storm,企业里面hive百分之八十的命令都是通过hive-cli命令来调的,sparksql的作用等同于hive-cli。hive-cli是跑在mapreduce,sparksql是运行在spark上,通过sparksql --help可以看cli,比如指定内存,核数,以及执行cli的命令,他是完全仿造hive的。

比如在hive上执行:hive -e "select * from daily_visit",同样在spark中可以直接执行spark-sql -e "select * from daily_visit",这两个都可以执行hive的语句,如果我们想指定一些资源的话,可以这样写,spark-sql -e "select * from daily_visit" --master yarn --driver-cores 2 --driver-memory 1g或者spark-sql -f aa.sql --master yarn --driver-cores 2 --driver-memory 1g对应hive -f也是一样的。

然而必须能传参数,比如时间,才能推广使用,但是-f不支持,比如说spark-sql -f aa.sql 2015-05-08不支持,但是有很多方式进行封装,让他支持。-i通常用于初始化hive udf上,initialize hive file。

hive在企业里面就是写sql。无论什么作业,都是用shell脚本写。

比如一个shell脚本执行:sh rpt_sale_daily.sh 2015-01-01

more rpt_sale_daily.sh会出现:

#!/bin/sh

if [ $# = "1 " ]: then

date=$1

else

date='date  -d  -1days '+%Y-%m-%d'

fi

echo $date

cd /opt/cloudy/program/rpt_sale_daily

hiveF ./rpt_sale_daily.hql -date $date

if test $? -ne 0

then

exit 11

fi

hive2mysql ./aa.property -date $date

if test $? -ne 0

then

exit 21

fi

echo "123"

====

需求:开发一个命令,叫sparkF 比如sparkF ./aa.sql -date $date

val date = "2015-08-28" //通常通过参数传过来


val sqlStr =
  s"""
     |insert overwrite into daily_visit partition (date='$date')    //日期,通常是通过参数传进来的
     |select count(distinct guid) uv,sum(pv) pv,
     |count(case when pv>=2 then sessionid else null end) second_num,
     |count(sessionid) visits from
     |(select ds date, sessionid, max(guid) guid, count(url) pv from tracklog and hour='18'
     |and length(url) > 0
     |group by ds,sessionid) a
     |group by date
   """.stripMargin      

需要有sparkF这样一个命令,现在上千个hiveF这个命令,我只需要把她们换成sparkF即可。那整个hive的运行就可以都迁移到我们的spark上来了。

继续阅读