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")