Spark DataFrame日期格式问题

背景

在公司做一个大数据项目时,发现某日之后的业务数据都没有存入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,见如下截图,一目了然:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hmRXO9RQ-1656812715865)(https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/72efb78cf2f945fbae2587ba290f1b45~tplv-k3u1fbpfcp-zoom-1.image)]

经验

  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 标准 https://blog.csdn.net/dai451954706/article/details/46930167

convert String to date; and convert date to String
https://www.cnblogs.com/mlfh1234/p/9210046.html

我的代码:

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
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值