【问题标题】:org.apache.spark.sql.AnalysisException: Table not found while inserting data into Hive tableorg.apache.spark.sql.AnalysisException:将数据插入 Hive 表时找不到表
【发布时间】:2017-07-04 00:22:48
【问题描述】:

我正在尝试使用以下代码将数据框插入 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”上运行查询,但在那里找不到表,因此导致异常。但我不明白如何解决这个问题。谁能告诉我如何解决这个问题?

【问题讨论】:

  • table party 是从数据框创建的配置单元表或临时表?我从数据框中看到您创建了一个名为 emptab 的临时表
  • @SandeepSingh 更新了表名。
  • 有直接保存到Hive Table的方法。我认为 saveAsTableinsertInto 适用于 Spark 1.6。您是否尝试过使用它们?
  • 您使用的是哪个版本的 Spark 和 Scala?
  • @SandeepSingh Spark 版本:1.6.0

标签: scala apache-spark hive spark-dataframe


【解决方案1】:

registerTempTable("emptab") :这行代码用于在spark中创建表临时表,而不是在hive中。 要将数据存储到 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");

【讨论】:

    【解决方案2】:

    您正在将 RDD 隐式转换为数据帧,但您没有导入隐式对象,因此 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,则还要修剪所有空白。我也将它包含在上面的代码中。

    【讨论】:

    • 苦苦挣扎了一周,你的回答终于有帮助了。尽管“val hiveCont = val hiveCont = new org.apache.spark.sql.hive.HiveContext(sc)”,您可能需要更正这一行
    • 如果你想看看我在 Spark 版本 2 中的另一期:stackoverflow.com/questions/44888348/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-09
    • 1970-01-01
    • 1970-01-01
    • 2017-10-04
    • 1970-01-01
    • 2023-04-02
    相关资源
    最近更新 更多