2016-09-29 85 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

相關問題