Spark 从具有时间戳的镶木地板蜂巢 table 中读取

Spark read from parquet hive table having timestamp

我在 Hive 中有一个镶木地板 table,它有日期和时间戳字段。我现在想从 over spark 中读取这个 table,但它因镶木地板时间戳兼容性错误而失败。

Hive版本为1.2.1 & Spark版本为1.6.1

Exception in thread "main" java.lang.UnsupportedOperationException: Parquet does not support timestamp. See HIVE-6384 App at org.apache.hadoop.hive.ql.io.parquet.serde.ArrayWritableObjectInspector.getObjectInspector(ArrayWritableObjectInspector.java:98) App at org.apache.hadoop.hive.ql.io.parquet.serde.ArrayWritableObjectInspector.(ArrayWritableObjectInspector.java:60)

我尝试从 Hive 读取,它工作得很好。但是从 Spark 读取时失败。这是试图 运行.

的查询
import org.apache.spark.sql.hive._ 
val sqlContext = new HiveContext(sc)
sqlContext.sql("select * from hivetablename limit 10")

配置单元 table 如下所示。

CREATE EXTERNAL TABLE hivetablename (col1 string, date_time timestamp, somedate date) PARTITIONED BY (load_date date) 
ROW FORMAT SERDE 'org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe' 
STORED AS INPUTFORMAT 'org.apache.hadoop.hive.ql.io.parquet.MapredParquetInputFormat'  
OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.parquet.MapredParquetOutputFormat'
LOCATION 's3n://path'

有什么建议或解决方法吗?

快速检查一下,请查看您的 Spark 指的是哪个 Hive 版本?确保它不是指较旧的 Hive 版本 (<= Hive 0.13)。

首先检查Spark Version及其hive依赖版本(是否兼容)

如果 spark 版本和 hive 版本兼容但仍然出现错误,请检查以下内容: 在您的 spark 配置中添加以下内容
a) spark.sql.hive.metastore.version 1.2.1
b) spark.sql.hive.metastore.jars 内置

如果您使用的是 Databricks 集群,您可以将这些添加到集群配置中: Configuration->Advanced Options->Spark->Spark Conf

已添加对 1.2.x 版本的支持