Spark DataFrame日期格式问题

410 阅读3分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

背景

在公司做一个大数据项目时,发现某日之后的业务数据都没有存入ES,后来发现root cause是日期格式不符合。

读取的时候,已经是timestamp类型了(见如下dataFrame.printSchema

现在关键是DataFrame和CSV的格式转换问题,看来要显式转换比较靠谱

    val userBiddingResultSchema = FbUserBiddingResultPojo.structType
    val userBiddingResultDf = sparkSession.read.schema(userBiddingResultSchema).csv(mdlResultPath)
进一步分析发现是数据格式问题,US的几十万数据中,有条是url里面带了逗号,这样就错位了,我们现在在spark中指定的是inferSchema为true,也就是依赖spark自动解析列的数据并判断类型,当US的数据中存在问题,这一列就没有这样整齐划一了,spark将其判断为string,见如下截图,一目了然:

在这里插入图片描述

经验

  1. spark中读取csv,不能设置inferSchema为true,依赖spark自身解析,还是要显式指定schema
  2. ES的index,put double(我已经弄了),date字段本身就可以自动解析;其实只要putInteger就可以,企业级应用还是建议都事先新建ES的index
  3. TimeStamp匹配问题还是要尽快解决,现在就pla和text和display的依赖于clickId加上timestamp的匹配,但是两者有时区的差异,我当时的解决是去掉了小时,会造成零点前后的数据匹配不上,周末形成解决方案,具体如下:

TimeStamp匹配问题解决

参考 ISO 8601 标准 blog.csdn.net/dai45195470…

convert String to date; and convert date to String www.cnblogs.com/mlfh1234/p/…

我的代码:

import java.sql.{Date, Timestamp}
import java.util.Locale
import java.text.SimpleDateFormat

object Demo {
  def main(args:Array[String]): Unit = {
    val str: String = ""
    println("begin...")
    val loc = new Locale("en")
    val fm = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSXXX",loc)
    val tm = "2019-10-14T11:35:41.005-07:00"
    val dt2 = fm.parse(tm)
    println(dt2.getTime())

    //reverse
    val ts = new Timestamp(System.currentTimeMillis())
    println(ts)
    println(fm.format(ts))
  }
}

对比测试的结果却是:日期转化和字符串直接处理,结果上没有区别,都是966条,实际源文件是962条,也就是有2条记录重复了

通过写java程序解析

1572995047000Cj0KCQiAtf_tBRDtARIsAIbAKe187WBetzRXJ-It8hL053IZKhOiIs2eWazHPBlxLNeUkDsLCjwoZ4waAlHREALw_wcB | count : 4
1573091679000Cj0KCQjwr-_tBRCMARIsAN413WTp0pgFVL16yWU9VowmLmPL9gvuLox0DSBHS0yeCNcNQSJkbnsim84aAlIjEALw_wcB | count : 4

在原始文件中找到了重复的记录(主键完全一样,但是后面几个金额不一样,有0的):

121行:
Google,136,PLA,2,Cj0KCQiAtf_tBRDtARIsAIbAKe187WBetzRXJ-It8hL053IZKhOiIs2eWazHPBlxLNeUkDsLCjwoZ4waAlHREALw_wcB,2156222200820561,1140946,1824172998,1,2019-11-05,2019-11-05T16:04:07.000-07:00,1,101,47.99,48.85382,48.85382,,1,154.3780712
606行:
Google,136,PLA,2,Cj0KCQiAtf_tBRDtARIsAIbAKe187WBetzRXJ-It8hL053IZKhOiIs2eWazHPBlxLNeUkDsLCjwoZ4waAlHREALw_wcB,2156222200820561,1140946,1824172998,0,2019-11-05,2019-11-05T16:04:07.000-07:00,1,101,47.99,0.0,0.0,0.0,1,0.0