spark sql时间类型转换以及其他

时间:2024-02-19 12:03:04

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