从具有时间戳的镶木地板蜂巢表中读取火花
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 中的镶木地板文件?