【问题标题】:Spark csv data validation failed for date and timestamp data types of HiveHive 的日期和时间戳数据类型的 Spark csv 数据验证失败
【发布时间】:2017-08-16 04:40:15
【问题描述】:

Hive 表架构:

c_date                  date                                        
c_timestamp             timestamp   

这是文本表

Hive 表数据:

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 选项。但是datetimestamp 列在 Hive 中可以有不同的格式。

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

【问题讨论】:

  • 你能分享df.printSchema()的输出吗?

标签: csv apache-spark hive apache-spark-sql databricks


【解决方案1】:

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

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

【讨论】:

  • 感谢您的回复!但是我不能像我在问题末尾提到的那样放置硬编码的时间戳格式。
  • 有没有办法在 spark 1.6 中存储纳秒时间戳?
  • 你提到日期和时间戳有不同的格式,你可以同时使用它们
【解决方案2】:

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")

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-04-14
    • 1970-01-01
    • 1970-01-01
    • 2012-08-19
    • 1970-01-01
    • 2023-01-24
    • 1970-01-01
    • 2014-04-02
    相关资源
    最近更新 更多