配置单元的日期和时间戳数据类型的Spark csv数据验证失败

配置单元的日期和时间戳数据类型的Spark csv数据验证失败,csv,apache-spark,hive,apache-spark-sql,databricks,Csv,Apache Spark,Hive,Apache Spark Sql,Databricks,配置单元表架构: c_date date c_timestamp timestamp 这是文本表 配置单元表数据: hive> select * from all_datetime_types; OK 0001-01-01 0001-01-01 00:00:00.000000001 9999-12-31 9999-12-31 23:59:59

配置单元表架构:

c_date                  date                                        
c_timestamp             timestamp   
这是文本表

配置单元表数据:

hive> select * from all_datetime_types;
OK
0001-01-01  0001-01-01 00:00:00.000000001
9999-12-31  9999-12-31 23:59:59.999999999
spark作业后获得的csv:

c_date,c_timestamp
0001-01-01 00:00:00.0,0001-01-01 00:00:00.0
9999-12-31 00:00:00.0,9999-12-31 23:59:59.999
问题:

  • 日期类型中添加了
    00:00:00.0
  • 时间戳被截断为毫秒精度
有用代码:

SparkConf conf = new SparkConf(true).setMaster("yarn-cluster").setAppName("SAMPLE_APP");
SparkContext sc = new SparkContext(conf);
HiveContext hc = new HiveContext(sc);
DataFrame df = hc.table("testdb.all_datetime_types");
df.printSchema();
DataFrameWriter writer = df.repartition(1).write();
writer.format("com.databricks.spark.csv").option("header", "true").save(outputHdfsFile);

我知道
dateFormat
选项。但是
date
timestamp
列在配置单元中可以有不同的格式


我可以简单地将所有列转换为字符串吗?

您可以使用spark中的
timestampFormat
选项指定时间戳格式

spark.read.option("timestampFormat", "MM/dd/yyyy h:mm:ss a").csv("path")

Spark支持高达纳秒的时间戳精度。您可以尝试映射日期和时间戳列,如下所示

DataFrame df = hiveContext.sql("select from_unixtime(unix_timestamp(date, 'yyyy-MM-dd'),'yyyy-MM-dd'), from_unixtime(unix_timestamp(timestamp, 'yyyy-MM-dd HH:mm:ss.SSSSSS'),'yyyy-MM-dd HH:mm:ss.SSSSSS') from table")

谢谢你的回复!但是我不能像我在问题的最后提到的那样使用硬编码的时间戳格式。有没有办法在spark 1.6中存储纳秒时间戳?您提到的日期和时间戳有不同的格式,您可以同时使用它们。您可以共享
df.printSchema()
的输出吗?