调用 saveAsTable 时出现 org.apache.spark.sql.AnalysisException

Posted

技术标签:

【中文标题】调用 saveAsTable 时出现 org.apache.spark.sql.AnalysisException【英文标题】:org.apache.spark.sql.AnalysisException when calling saveAsTable 【发布时间】:2017-06-30 13:33:41 【问题描述】:

我该如何解决这个错误?

以下代码在 Zeppelin 中有效,但在编译到汇编 jar 并使用 spark-submit 提交时无效。

错误是:

org.apache.spark.sql.AnalysisException:指定数据库名称或 临时表不允许使用其他限定符。如果表 名称中包含点 (.),请用反引号引用表名 (`).;

代码:

    import org.apache.spark._
    import org.apache.spark.rdd.NewHadoopRDD
    import org.apache.spark.SparkContext
    import org.apache.spark.SparkContext._
    import org.apache.spark.SparkConf
    import org.apache.spark.sql.SQLContext
    import org.apache.spark.sql.hive.HiveContext 
    import java.text.SimpleDateFormat
    import java.util.Calendar  

    case class Benchmark(date: String, time: String, start_end: String, 
                         server: String, timestamp: Long, interface: String, 
                         cid: String, raw: String)

    object job 

        def main(args: Array[String]) 

            val sdf = new java.text.SimpleDateFormat("yyyyMMdd")
            val sdf1 = new java.text.SimpleDateFormat("yyyy-MM-dd")
            val calendar = Calendar.getInstance()
            calendar.set(Calendar.DAY_OF_YEAR, 
                         calendar.get(Calendar.DAY_OF_YEAR) -1)
            val date = sdf.format(calendar.getTime())
            val dt = sdf1.format(calendar.getTime())

            val conf = new SparkConf().setAppName("Interface_HtoH_Job")
            val sc = new SparkContext(conf)
            val sqlContext = new SQLContext(sc)
            import sqlContext.implicits._
            val hiveContext = new HiveContext(sc)

            val benchmarkText = sc.textFile(s"hdfs:/rawlogs/prod/log/$date/*.gz")

            val pattern = "([0-9-]10) ([0-9:]8),[0-9]1,3 Benchmark..* - (Start|End)<ID=([0-9a-zA-Z_]+)-([0-9]+)><([0-9a-zA-Z.,:!@() =_-]*)><cid=TaskId_([0-9A-Z#_a-z]+),.*><[,0-9:a-zA-Z ]+>".r

            benchmarkText.filter  ln => ln.startsWith("2017-") 
                         .filter  l => l.endsWith(">") 
                         .filter  k => k.contains("<cid=TaskId") 
                         .map  line =>
                                try 
                                    var pattern(date,time,startEnd,server,ts,interface,cid) = line
                                      Benchmark(date,time,startEnd,server,ts.toLong,interface,cid,line)

                                 catch 

                                    case e: Exception => Benchmark(dt,"00:00:00","bad",e.toString,"0".toLong,"bad","bad",line)

                                

                              .toDF()
                .write
                .mode("overwrite")
                .saveAsTable("prod_ol_bm.interface_benchmark_tmp") // error here
    

使用 spark-submit 运行:

HDP : 2.5.3.0-37
Spark : 1.6.2.2.5.3.0-37 built for Hadoop 2.7.3.2.5.3.0-37

【问题讨论】:

您似乎忘记了真正提出问题。请花更多时间整理您的问题,然后查看它以确保您已包含清晰的问题陈述。 【参考方案1】:

更改以下行

val sqlContext = new SQLContext(sc)

val sqlContext = new HiveContext(sc)

shell 和 zeppelin 都创建了名为 sqlContext 的 HiveContext,这有点傻。 您需要 HiveContext 才能连接到 hive。

【讨论】:

以上是关于调用 saveAsTable 时出现 org.apache.spark.sql.AnalysisException的主要内容,如果未能解决你的问题,请参考以下文章

创建 MPI 结构时出现问题,调用 MPI_Bcast 时出现错误 11

为啥调用 GetThreadTimes 时出现“句柄无效”错误?

进行 JNI 调用时出现 Unsatisfied Link 错误

调用类方法时出现“调用未定义函数”错误

调用 getLastKnownLocation 时出现 SecurityException

在 C# 中调用 WCF 元数据时出现 *** 错误