背景
在公司做一个大数据项目时,发现某日之后的业务数据都没有存入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)]
经验
- spark中读取csv,不能设置inferSchema为true,依赖spark自身解析,还是要显式指定schema
- ES的index,put double(我已经弄了),date字段本身就可以自动解析;其实只要putInteger就可以,企业级应用还是建议都事先新建ES的index
- 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