我们正在从 spark 写入文件并从 Athena/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 文件时,你能帮忙解决一下出了什么问题吗?
最佳答案
我认为这是 Hive 存储 Parquet 时间戳的一个众所周知的错误 in a way that is incompatible with other tools .在使用 Impala 检索我用 Spark 编写的 Hive 数据时,我遇到了类似的问题。我相信this was resolved在 Spark 2.3 中。
关于scala - 由 spark 编写的 Parquet 文件中的 Athena/Hive 时间戳,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50711525/