我正在尝试使用以下代码将数据框插入到 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”上运行查询,但在那里找不到表,因此导致异常。但我不明白如何解决这个问题。谁能告诉我如何解决这个问题?
您正在将 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")
如果您将 a 转换String
为Integer
. 我也将其包含在上面的代码中。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句