蜂巢从csv读取蜂巢中的时间戳记,由spark生成为null

时间:2018-10-23 14:46:01

标签: scala apache-spark hive

所以我输入的数据如下:

HEADER_A|HEADER_B|HEADER_C|HEADER_D
2018-09-28 22:12:09.0461760|first|last|123
2018-09-28 22:14:11.0123550|first|second|124

然后,我将其读取到数据框中,并将其保存为名为temp_view的临时视图。一切都作为字符串读取。

然后我将查询此temp_view:

val df = sqlContext.sql("""
    SELECT
    from_unixtime(unix_timestamp(), 'yyyy-MM-dd HH:mm:ss') as ETL_RunDate,
    HEADER_A as timestamp,
    HEADER_B as string,
    HEADER_c as string,
    HEADER_D as string
    FROM temp_view
""")

然后将该数据帧写入文件。该文件的外观如下

2018-10-23 05:32:49|2018-09-28T22:12:09.046Z|first|last|123
2018-10-23 05:32:49|2018-09-28T22:14:11.123Z|first|second|124

如果我然后将此数据用作具有架构的配置单元表的数据:

CREATE EXTERNAL TABLE `testdb.testtable`(
  `runts` timestamp COMMENT '',
  `header_a` timestamp COMMENT '',
  `header_b` string COMMENT '',
  `header_c` string COMMENT '',
  `header_d` string COMMENT '')

并查询此表-

select * from testdb.testtable;

header_a在应该作为基础数据存在时应为null。

为什么会这样,我该如何解决?

1 个答案:

答案 0 :(得分:1)

问题在于输出文件yyyy-MM-dd'T'HH:mm:ss.SSSX中的时间戳格式与默认的Hive时间戳格式yyyy-mm-dd hh:mm:ss[.f...]不同。

您有两个选择:

  • 使用默认格式写出文件。您将不得不将自己的写入内容更新为df.write.format("csv").option("dateFormat", "yyyy-MM-dd hh:mm:ss.SSSSSSS")
  • 更新表的SERDEPROPERTIES以读取格式– ALTER TABLE testtable SET SERDEPROPERTIES ("timestamp.formats"= "yyyy-MM-dd'T'HH:mm:ss.SSSX")