【问题标题】:Athena/Hive timestamp in parquet files written by sparkspark编写的parquet文件中的Athena/Hive时间戳
【发布时间】:2018-11-15 14:46:25
【问题描述】:

我们正在从 spark 写入文件并从 Athena/Hive 读取。 我们在使用 hive 时遇到了时间戳问题。

 scala> val someDF = Seq((8, "2018-06-06 11:42:43")).toDF("number", "word")
someDF: org.apache.spark.sql.DataFrame = [number: int, word: string]

scala> someDF.coalesce(1).write.mode("overwrite").option("delimiter", "\u0001").save("s3://test/")

这会创建一个 parquet 文件,我创建了一个表

CREATE EXTERNAL TABLE `test5`(
  `number` int, 
  `word` timestamp)
ROW FORMAT DELIMITED 
  FIELDS TERMINATED BY '\u0001' 
STORED AS INPUTFORMAT 
  'org.apache.hadoop.hive.ql.io.parquet.MapredParquetInputFormat' 
OUTPUTFORMAT 
  'org.apache.hadoop.hive.ql.io.parquet.MapredParquetOutputFormat'
LOCATION
  's3://test/'

选择查询失败,出现问题: HIVE_BAD_DATA:parquet中字段字的BINARY类型与表模式中定义的类型时间戳不兼容

在使用纯 csv 文件进行测试时,同样的情况。

scala>someDF.coalesce(1).write.format("com.databricks.spark.csv").mode("overwrite").option("delimiter", "\u0001").save("s3://test")

Table:
CREATE EXTERNAL TABLE `test7`(
  `number` int, 
  `word` timestamp)
ROW FORMAT DELIMITED 
  FIELDS TERMINATED BY '\u0001' 
STORED AS INPUTFORMAT 
  'org.apache.hadoop.mapred.TextInputFormat' 
OUTPUTFORMAT 
  'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
LOCATION
  's3://test/'

当我们把它写成 parquet 文件时,你能帮忙解决什么问题吗?

【问题讨论】:

  • 你能说明你使用的spark版本吗?
  • @SamsonScharfrichter 是唯一正确的答案。这种情况在 2020 年仍在发生。我希望这是解决这个问题的方式更加明显。

标签: scala apache-spark amazon-s3 hive parquet


【解决方案1】:

我认为这是 Hive 存储镶木地板时间戳 in a way that is incompatible with other tools 的一个众所周知的错误。在使用 Impala 检索我用 Spark 编写的 Hive 数据时,我遇到了类似的问题。我相信 Spark 2.3 中的 this was resolved

【讨论】:

    猜你喜欢
    • 2015-04-02
    • 2019-10-19
    • 1970-01-01
    • 1970-01-01
    • 2017-09-06
    • 2019-06-10
    • 2019-02-24
    • 1970-01-01
    • 2021-04-19
    相关资源
    最近更新 更多