2017-06-23 83 views
0

我試圖將數據插入到蜂巢表是這樣的:表未找到錯誤而載入數據框成蜂巢分區

val partfile = sc.textFile("partfile") 
val partdata = partfile.map(p => p.split(",")) 
val partSchema = StructType(Array(StructField("id",IntegerType,true),StructField("name",StringType,true),StructField("salary",IntegerType,true),StructField("dept",StringType,true),StructField("location",StringType,true))) 
val partRDD = partdata.map(p => Row(p(0).toInt,p(1),p(2).toInt,p(3),p(4))) 
val partDF = sqlContext.createDataFrame(partRDD, partSchema) 

包我的輸入:

import org.apache.spark.sql.Row 
import org.apache.spark.sql.Row 
import org.apache.spark.sql.types.{StructType,StructField,StringType,IntegerType} 
import org.apache.spark.sql.types._ 

這是我怎麼想將數據幀插入Hive分區:

partDF.write.mode(saveMode.Append).partitionBy("location").insertInto("parttab") 

即使我擁有Hive表,我仍然得到下面的錯誤:

org.apache.spark.sql.AnalysisException: Table not found: parttab; 

有人能告訴我什麼是我在這裏做的錯誤,我該如何糾正它?

回答

1

要將數據寫入Hive倉庫,您需要初始化hiveContext實例。

一旦這樣做,它會從Hive-Site.xml(來自classpath);並連接到底層的Hive倉庫。

HiveContextSQLContext的擴展,用於支持和連接配置單元。

要做到這一點,試試這個::

val hc = new HiveContext(sc) 

,並執行append-query ONN此實例​​。

partDF.registerAsTempTable("temp") 

hc.sql(".... <normal sql query to pick data from table `temp`; and insert in to Hive table > ....") 

請確保該表parttab正在分貝 - default

如果在另一個數據庫的表,表名應指定爲:<db-name>.parttab

如果您需要直接保存到蜂房dataframe;使用這個:

df.saveAsTable("<db-name>.parttab") 
+0

你能告訴你在哪裏指定數據幀嗎? – Sidhartha

+0

我試過像這樣: scala> hc.sql(「insert into parttab partition(location ='India')select ptab」)中的id,name,salary,dept,location)。 獲取錯誤: 導致:錯誤XJ040:無法使用類加載器啓動數據庫'metastore_db'[email protected]ac587b,org.apache.derby.iapi.error .StandardException.newException(Unknown Source) at org.apache.derby.impl.jdbc.SQLExceptionFactory.wrapArgsForTransportAcrossDRDA(Unknown Source) 錯誤XSDB6:另一個Derby實例可能已經引導了數據庫/ home/cloudera/metastore_db 。 – Sidhartha

+0

當你在spark shell中運行時,你不應該實例化一個實例名稱爲「hc」的HiveContext,它會自動創建一個名爲sqlContext的實例。 (該名稱具有誤導性 - 如果您將Hive編譯爲Spark,它將成爲HiveContext)。請參閱類似的討論:'https:// issues.apache.org/jira/browse/SPARK-9776'。 –