猿问

如下,DB2时间戳数据导入到SparkSql时,怎样转换为SparkSql中的timestamp?

DB2数据库到处的数据文件中包含时间戳,
格式为yyyy-MM-dd-HH.mm.ss.SSSSSS,
如:2017-01-01-12.00.00.120189
当通过spark读取时指定读取的格式为yyyy-MM-dd HH.mm.ss.SSS
会出现将最后的6位SSSSSS进行计算,除以1000,算出对应的秒,进位到秒位上,出现错误,转化后为:2017-01-01 12:02:00.189,被增加了两分钟。

具体代码如下:
Dataset<Row> dataset = sparkSession.read()
.format("com.databricks.spark.csv")
.option("inferSchema", "true")
.option("delimiter", ",")
.option("timestampFormat", "yyyy-MM-dd-HH.mm.ss.SSS")
.option("mode", "FAILFAST")
.schema(schema)
.load("src/test/resource/file/person_10h_timestamp.txt");
dataset.show();
-------------解决方法---------------------------------------------------------
通过测试,发现可以使用非常规方法实现想要的效果。
如下:
即使用格式为

.option("timestampFormat", "yyyy-MM-dd-HH.mm.ss.SSSFFF")
实现舍弃最后三位。
以下为测试的结果:
// 原始数据:2017-01-01-12.00.00.120189
// 使用yyyy-MM-dd-HH.mm.ss.SSS -> 2017-01-01 12:02:00.189 增加两分钟
// 使用yyyy-MM-dd-HH.mm.ss.SSSSSS -> 2017-01-01 12:02:00.189 增加两分钟
// 使用yyyy-MM-dd-HH.mm.ss.SSSFFF -> 2017-01-01 12:00:00.12 OK
// 使用yyyy-MM-dd-HH.mm.ss.SSSCCC -> 报错

慕姐4208626
浏览 193回答 1
1回答

蓝山帝景

Spark SQL是支持在Spark中使用Sql、HiveSql、Scala中的关系型查询表达式。它的核心组件是一个新增的RDD类型SchemaRDD,它把行对象用一个Schema来描述行里面的所有列的数据类型,它就像是关系型数据库里面的一张表。它可以从原有的RDD创建,也可以是Parquet文件最重要的是它可以支持用HiveQL从hive里面读取数据。
随时随地看视频慕课网APP
我要回答