spark sql時間類型轉換以及其他


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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM