2016-09-29 86 views
0

我在Hive中具有日期&时间戳字段的实木复合地板表。我现在想从火花中读取此表,但它会因拼花时间戳兼容性错误而失败。从具有时间戳的实木复合地板表中读取的火花

的蜂巢版本是1.2.1 &星火版本是1.6.1线程

异常“主要” java.lang.UnsupportedOperationException:木地板不支持时间戳。见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") 

配置单元表如下所示。

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' 

任何建议或解决方法?

+0

您使用的是什么版本的配置单元和火花?你可以粘贴代码给出这个错误 –

+0

设置spark.sql.hive.convertMetastoreParquet confuguration为false。当设置为false时,Spark SQL将使用Hive SerDe来实现地板表,而不是内置支持。希望这可以解决你的问题。 –

+0

Parquet的配置可以使用SQLContext上的setConf方法或使用SQL运行SET key = value命令来完成。 –

回答

1

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

+0

这是正确的,它内部引用的配置单元Metore是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) – Akarsh

+0

我试着用Spark 1.6设置最新版本的配置单元测试集群,它工作正常。这个问题似乎与Hive Metastore的旧版本完全相关。 – Akarsh

+0

嗨Akarsh,你使用哪个版本的蜂巢? – user2814799

相关问题