org.apache.spark.sql.AnalysisException:将数据插入Hive表时找不到表

时间:2017-07-03 08:53:42

标签: scala apache-spark hive spark-dataframe

我正在尝试使用以下代码将数据框插入到Hive表中:

import org.apache.spark.sql.SaveMode
import org.apache.spark.sql._
val hiveCont =  val hiveCont = new org.apache.spark.sql.hive.HiveContext(sc)
val empfile = sc.textFile("empfile")
val empdata = empfile.map(p => p.split(","))
case class empc(id:Int, name:String, salary:Int, dept:String, location:String)
val empRDD  = empdata.map(p => empc(p(0).toInt, p(1), p(2).toInt, p(3), p(4)))
val empDF   = empRDD.toDF()
empDF.registerTempTable("emptab")

我在Hive中有一个表,其中包含以下DDL:

# col_name              data_type               comment             

id                      int                                         
name                    string                                      
salary                  int                                         
dept                    string                                      

# Partition Information      
# col_name              data_type               comment             

location                string           

我正在尝试将临时表插入到hive表中,如下所示:

hiveCont.sql("insert into parttab select id, name, salary, dept from emptab")

这是一个例外:

org.apache.spark.sql.AnalysisException: Table not found: emptab. 'emptab' is the temp table created from Dataframe

在这里,我理解hivecontext将在Spark上运行'HIVE'查询,并且在那里找不到表,因此导致异常。但我不明白我如何解决这个问题。可以告诉我如何解决这个问题吗?

2 个答案:

答案 0 :(得分:1)

registerTempTable("emptab") :这行代码用于在spark中创建表临时表,而不是在hive中。 要将数据存储到配置单元,必须首先在hive中显式创建表。要将表值数据存储到hive表,请使用以下代码:

import org.apache.spark.sql.SaveMode
import org.apache.spark.sql._

val hiveCont = new org.apache.spark.sql.hive.HiveContext(sc)
val empfile = sc.textFile("empfile")
val empdata = empfile.map(p => p.split(","))
case class empc(id:Int, name:String, salary:Int, dept:String, location:String)
val empRDD  = empdata.map(p => empc(p(0).toInt, p(1), p(2).toInt, p(3), p(4)))
val empDF   = empRDD.toDF()
empDF.write().saveAsTable("emptab");

答案 1 :(得分:0)

您隐式将RDD转换为dataFrame,但您没有导入隐式对象,因此RDD未转换为数据帧。在导入中包含以下行。

// this is used to implicitly convert an RDD to a DataFrame.
import sqlContext.implicits._

案例类也必须在顶层定义 - 它们不能嵌套。所以你的最终代码应该是这样的:

import org.apache.spark._
import org.apache.spark.sql.hive.HiveContext;
import org.apache.spark.sql.DataFrame
import org.apache.spark.rdd.RDD
import org.apache.spark.sql._
import sqlContext.implicits._

val hiveCont = new org.apache.spark.sql.hive.HiveContext(sc)
case class Empc(id:Int, name:String, salary:Int, dept:String, location:String)
val empFile = sc.textFile("/hdfs/location/of/data/")
val empData = empFile.map(p => p.split(","))
val empRDD = empData.map(p => Empc(p(0).trim.toInt, p(1), p(2).trim.toInt, p(3), p(4)))
val empDF = empRDD.toDF()
empDF.registerTempTable("emptab")

如果您要将String转换为Integer,请修剪所有空白区域。我也在上面的代码中包含了它。