从具有时间戳的镶木地板蜂巢表中读取火花

Posted

技术标签:

【中文标题】从具有时间戳的镶木地板蜂巢表中读取火花【英文标题】:Spark read from parquet hive table having timestamp 【发布时间】: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”添加它。它失败并显示相同的错误消息。 看起来是版本兼容性问题,你可能需要用最新版本的蜂巢尝试一次。 【参考方案1】:

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

【讨论】:

没错,它内部引用的 Hive Metastore 是 0.13.1。我尝试将其更改为较新的版本(0.14.0、1.2.1),但是现在失败并出现不同的错误。 -- 线程“main”中的异常 java.lang.NoSuchMethodException: org.apache.hadoop.hive.conf.HiveConf.getTimeVar(org.apache.hadoop.hive.conf.HiveConf$ConfVars, java.util.concurrent.TimeUnit) 我尝试使用 Spark 1.6 的最新版本 hive 设置一个测试集群,它运行良好。该问题似乎与旧版本的 hive Metastore 完全相关。 嗨 Akarsh,您使用的是哪个版本的 hive?【参考方案2】:

首先检查 Spark 版本及其 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 版本的支持

【讨论】:

嗨,Ravindra,欢迎来到 SO。也许用户必须升级 Hive 依赖才能与 spark 版本完美匹配。 嗨尼奥,也可能是另一种方式。用户可能需要升级 spark 版本。

以上是关于从具有时间戳的镶木地板蜂巢表中读取火花的主要内容,如果未能解决你的问题,请参考以下文章

如何在读取前根据定义的模式读取 pyspark 中的镶木地板文件?

将火花数据帧中的日期时间时间戳转换为 epocTimestamp

蜂巢时间戳不接受 Spark 时间戳类型

从镶木地板表中选择在蜂巢中不返回任何内容

读取列中具有混合数据类型的镶木地板文件

用于从表中选择具有最新时间戳的行的 JOOQ 代码