如何访问配置单元中的现有表?

brtdzjyr  于 2021-06-26  发布在  Hive
关注(0)|答案(1)|浏览(330)

我正在尝试使用scala从spark应用程序访问hive。
我的代码:

val hiveLocation   = "hdfs://master:9000/user/hive/warehouse"
val conf = new SparkConf().setAppName("SOME APP NAME").setMaster("local[*]").set("spark.sql.warehouse.dir",hiveLocation)

val sc = new SparkContext(conf)
val spark = SparkSession
  .builder()
  .appName("SparkHiveExample")
  .master("local[*]")
  .config("spark.sql.warehouse.dir", hiveLocation)
  .config("spark.driver.allowMultipleContexts", "true")
  .enableHiveSupport()
  .getOrCreate()
println("Start of SQL Session--------------------")

spark.sql("select * from test").show()
println("End of SQL session-------------------")

但最后会出现错误消息
未找到表或视图
但当我跑的时候 show tables; 在Hive控制台下,我可以看到那个表并可以运行 Select * from test . 都在“用户/Hive/仓库”位置。只是为了测试,我尝试了createtable,也来自spark,只是为了找出表的位置。

val spark = SparkSession
      .builder()
  .appName("SparkHiveExample")
  .master("local[*]")
  .config("spark.sql.warehouse.dir", hiveLocation)
  .config("spark.driver.allowMultipleContexts", "true")
  .enableHiveSupport()
    .getOrCreate()
println("Start of SQL Session--------------------")
spark.sql("CREATE TABLE IF NOT EXISTS test11(name String)")
println("End of SQL session-------------------")

这段代码也正确地执行了(带有成功注解),但奇怪的是我可以从配置单元控制台找到这个表。
即使我使用 select * from TBLS; 在mysql中(在我的设置中,我将mysql配置为hive的metastore),我没有找到那些从spark创建的表。
spark的位置和Hive控制台不同吗?
如果需要从spark访问配置单元中的现有表,我必须做什么?

mbjcgjjk

mbjcgjjk1#

来自sparksql编程指南:(我强调了相关部分)
配置单元的配置是通过将hive-site.xml、core-site.xml(用于安全配置)和hdfs-site.xml(用于hdfs配置)文件放在conf/中完成的。
使用配置单元时,必须使用配置单元支持示例化sparksession,包括连接到持久配置单元元存储、支持配置单元serde和配置单元用户定义函数。没有现有配置单元部署的用户仍然可以启用配置单元支持。如果未由hive-site.xml配置,则上下文会自动在当前目录中创建metastore\ db,并创建由spark.sql.warehouse.dir配置的目录,该目录默认为启动spark应用程序的当前目录中的spark warehouse目录
你需要添加一个 hive-site.xml 配置文件到 resource 目录。以下是spark使用配置单元所需的最小值(将主机设置为配置单元的主机):

<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
    <property>
        <name>hive.metastore.uris</name>
        <value>thrift://host:9083</value>
        <description>IP address (or fully-qualified domain name) and port of the metastore host</description>
    </property>

</configuration>

相关问题