首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >无法将SparkSession连接到Hive

无法将SparkSession连接到Hive
EN

Stack Overflow用户
提问于 2018-10-13 20:03:20
回答 2查看 1.8K关注 0票数 0

我从.csv文件中获取数据,然后将df注册为TempView。之后,我尝试将内容从TempView写到Hive表。但是,我得到了数据库找不到的错误。但我确实有蜂巢里的数据库。

以下是代码:

代码语言:javascript
运行
复制
import org.apache.spark.sql.types._
import org.apache.spark.sql.SparkSession
import org.apache.spark.sql.functions.col


object read_data {


  def main (args:Array[String]) {

    val spark = SparkSession
      .builder()
      .master("local[*]")
      .appName("Spark SQL basic example")
      .config("spark.executor.memory", "1g")
      .config("hive.metastore.warehouse.dir", "user/hive/warehouse")
      .enableHiveSupport()
      .getOrCreate()

    ///val hiveContext =  new org.apache.spark.sql.hive.HiveContext(spark);


    val customSchema = StructType(Array(
      StructField("order_id", IntegerType, true),
      StructField("parent_order_uuid", StringType, true),
      StructField("company", StringType, true),
      StructField("country_id", IntegerType, true)))

    val readogp = spark.read.format("csv")
      .option("header", "false")
      .schema(customSchema)
      .load("/home/cloudera/Desktop/ogp_csv.csv")

   // readogp.createOrReplaceTempView("OGP_INTL")

    val read_country = spark.read.format("csv")
      .option("header", "true")
      .load("/home/cloudera/Desktop/country.csv")


    //read_country.createOrReplaceTempView("Dim_Country")
      println("************************************************************************")


    val rept = readogp.join(read_country, readogp("country_id") === read_country("country_id"),"inner")

    val final_rp = rept.select(col("order_id"), col("country_iso_code_2"))
      .groupBy("country_iso_code_2")
      .sum("order_id")
      .orderBy("country_iso_code_2")

      final_rp.createOrReplaceTempView("FINAL_REPORT_OGP")


    spark.sql("use ods")
    spark.sql("""insert into ods.final_ogp
       select * from FINAL_REPORT_OGP""")

  }

}

错误日志:

代码语言:javascript
运行
复制
18/10/13 13:01:56 INFO HiveMetaStore: 0: get_database: ods
18/10/13 13:01:56 INFO audit: ugi=cloudera  ip=unknown-ip-addr  cmd=get_database: ods   
18/10/13 13:01:56 WARN ObjectStore: Failed to get database ods, returning NoSuchObjectException
Exception in thread "main" org.apache.spark.sql.catalyst.analysis.NoSuchDatabaseException: Database 'ods' not found;

数据库ods确实存在于Hive中,表也存在。我在密码上犯了什么错误吗?

EN

回答 2

Stack Overflow用户

发布于 2018-10-14 08:04:51

我能检查的第一件事是spark spark.sql.catalogImplementation的值,它应该设置为hive。

这可以从Spark中找到(在本地模式下,默认情况下它应该可以在http://localhost:4040上访问)。

在创建enableHiveSupport时调用SparkSession,设置上面提到的conf,然后Spark使用HiveCatalog。

如果conf的值是内存中的,则使用Spark的内存目录.

我看到了enableHiveSupport的以下实现,

代码语言:javascript
运行
复制
def enableHiveSupport(): Builder = synchronized {
      if (hiveClassesArePresent) {
        config(CATALOG_IMPLEMENTATION.key, "hive")
      } else {
        throw new IllegalArgumentException(
          "Unable to instantiate SparkSession with Hive support because " +
            "Hive classes are not found.")
      }
    }




  private[spark] def hiveClassesArePresent: Boolean = {
    try {
      Utils.classForName(HIVE_SESSION_STATE_BUILDER_CLASS_NAME)
      Utils.classForName("org.apache.hadoop.hive.conf.HiveConf")
      true
    } catch {
      case _: ClassNotFoundException | _: NoClassDefFoundError => false
    }
  }

从上面的片段来看,可能是驱动程序类路径没有正确地设置为包含org.apache.hadoop.hive.conf.HiveConf

票数 0
EN

Stack Overflow用户

发布于 2018-10-14 22:00:13

程序当然无法连接到蜂巢仓库,似乎你给错了仓库路径。请更正路径:“用户/蜂巢/仓库”--我想是:"/user/hive/warehouse“(绝对路径)

另外还有一个检查:如果您是从Intellij运行程序(本质上是任何编辑器),您就会遇到这个问题。如果是,请在项目资源中添加hivesite.xml: /src/main/resources,还需要添加jars、Ex: Hive、mySQL连接器(如果MySQL转移)。

希望能帮上忙。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52796843

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档