1.spark sql的日期转换一般使用两种形式
第一种使用
to_timestamp(REACHTIME1,"yyyy-MM-dd HH24:mi:ss") //它将字符串时间转换为日期类型 例如2018-10-10 12:34:43
第二种使用时间戳的形式
to_timestamp(a.REACHTIME,"yyyy-MM-dd HH24:mi:ss") //转后是1970年至今的时间戳一大长串数据
2.如果spark是在本地电脑上跑,没有 打成jar放在集群上跑。只要代码运行,在本地也可以查看spark跑的过程
本地查看spark运行的路径:http://localhost:4040/jobs/ 注意要查看spark状态,无论是集群还是本地,都要运行spark项目且没有中断或停止可以看
3.说一些oralce和spark sql的语句
oralce方面:
WHERE D.LINE_NO(+) = E.LINE_NO //这个是sql片段。里面的(+)只得是是右连接这个字段
spark sql方面
LEAD (b.DISTANCE) OVER (PARTITION BY a.LINENO,a.BUSNO,a.ISUPDOWN ORDER BY REACHTIME) DISTANCE1
//这个lead...over在oralce也用到了。它的作用是获取下一条数据信息,又叫开窗函数
DISTANCE1是别名
//网址参考:https://blog.csdn.net/qq_39869388/article/details/80364985 ---spark streaming消费数据插入hbase里
//https://www.cnblogs.com/zhaojinhui/p/3999469.html ---sql
//https://blog.csdn.net/qq_33283716/article/details/81043264 ---spark sql
4.日期转换的另一种
java也是一样,下面以scala为例,我获取的日期时间类型是String类型。要先将字符串转为日期类型,然后再格式化自己想要的类型
//字符串转换日期日期类型
var sitetime= line._2.toString //yyyy-MM-dd HH24:mi:ss
val dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")
val mdate = dateFormat.parse(sitetime)
//第二次转换格式
val dateFormat3 = new SimpleDateFormat("yyyyMMddHHmmss")
val mdate3 = dateFormat3.format(mdate)
println("mdate:"+mdate3)
5.在代码里拼接hbase的rowkey
val rowkey =
"""
|SELECT
|concat(reverse(ALLOTTIME) , ISUPDOWN , (lpad(LINENO,6,0)) ,HOUR , (lpad(LABELNO,2,0)), (lpad(STATIONID,6,0))) as ROWKEY,
|LINENO,ISUPDOWN,LABELNO,STATIONID,STATIONNAME,PASSENGER,ALLOTTIME,HOUR
|FROM ROW
""".stripMargin
入库层面
6.日期类型计算(日期类型多种多样,祝你好运),下面标红是重点。这样做格式化kafka时间,然后将下面标红作为视图为下次计算做准备
val strSql=
"""
|SELECT
|LEAD(A.STATIONID)OVER(PARTITION BY A.LINENO,A.BUSNO,A.ISUPDOWN ORDER BY REACHTIME) STATIONIDNEXT,
|LEAD(A.LABELNO)OVER(PARTITION BY A.LINENO,A.BUSNO,A.ISUPDOWN ORDER BY REACHTIME) LABELNONEXT,
|B.DISTANCE,
|LEAD(B.DISTANCE)OVER(PARTITION BY A.LINENO,A.BUSNO,A.ISUPDOWN ORDER BY REACHTIME) DISTANCENEXT,
|to_timestamp(A.REACHTIME) REACHTIME,
|to_timestamp(LEAD(A.REACHTIME)OVER(PARTITION BY A.LINENO,A.BUSNO,A.ISUPDOWN ORDER BY REACHTIME)) REACHTIMENEXT
|--unix_timestamp(A.REACHTIME,'yyyy-MM-dd HH24:mi:ss'),这些没有用
|--unix_timestamp(LEAD(A.REACHTIME)OVER(PARTITION BY A.LINENO,A.BUSNO,A.ISUPDOWN ORDER BY REACHTIME),'yyyy-MM-dd HH24:mi:ss') REACHTIMENEXT 这些没有用
|FROM stationcurrenttable A , TM_STATION_LINE_INFO B
|WHERE A.LINENO=B.LINENO AND A.ISUPDOWN=B.ISUPDOWN AND A.LABELNO=B.LABELNO AND A.STATIONID=B.STATIONID
""".stripMargin
7.时间公里计算
val strSqlMid=
"""
|SELECT LINENO,ISUPDOWN,LABELNO,BUSNO,LABELNONEXT,STATIONID,STATIONIDNEXT,
|ROUND(((DISTANCENEXT-DISTANCE)/1000)/((cast(REACHTIMENEXT as long)-cast(REACHTIME as long))/(60*60)),2) SPEED
|--ROUND(((DISTANCENEXT-DISTANCE)/1000)/((REACHTIMENEXT-REACHTIME)/1000*60*60),2) SPEED
|FROM speedMidTable
|WHERE LABELNONEXT IS NOT NULL AND STATIONID<>STATIONIDNEXT AND REACHTIME<>REACHTIMENEXT
""".stripMargin
8.丢掉一些null数据(或等于0,小于0的数据)小技巧
val sql4=
"""
|select * from aaa where STATIONID != 'null' and STATIONNAME != 'null'
""".stripMargin //这里过滤,作为视图,为下面做准备
sqlContext.sql(sql4).toDF("ROWKEY","LINENO","ISUPDOWN","LABELNO","FULLRATE","STATIONID","STATIONNAME","ALLOTTIME","HOUR").createOrReplaceTempView("RW")