【发布时间】:2016-09-29 21:26:14
【问题描述】:
我在 Hive 中有一个镶木地板表,其中包含日期和时间戳字段。我现在想从 over spark 中读取此表,但由于 parquet 时间戳兼容性错误而失败。
hive 版本是 1.2.1 & Spark 版本是 1.6.1
线程“主”java.lang.UnsupportedOperationException 中的异常:Parquet 不支持时间戳。见 HIVE-6384 应用程序 在 org.apache.hadoop.hive.ql.io.parquet.serde.ArrayWritableObjectInspector.getObjectInspector(ArrayWritableObjectInspector.java:98) 应用程序 在 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")
hive 表如下所示。
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'
有什么建议或解决方法吗?
【问题讨论】:
-
您使用的是什么版本的 hive 和 spark ?你能粘贴给出这个错误的代码吗
-
将 spark.sql.hive.convertMetastoreParquet 配置设置为 false。当设置为 false 时,Spark SQL 将对 parquet 表使用 Hive SerDe 而不是内置支持。希望这能解决您的问题。
-
可以使用 SQLContext 上的 setConf 方法或使用 SQL 运行 SET key=value 命令来完成 Parquet 的配置。
-
@ArunakiranNulu 我尝试使用命令行参数“--conf spark.sql.hive.convertMetastoreParquet=false”添加它。它失败并显示相同的错误消息。
-
看起来是版本兼容性问题,你可能需要用最新版本的蜂巢尝试一次。
标签: apache-spark apache-spark-sql parquet