​ 问题原因:按照网上的诸多博客等想使用Spark直接读取Hive,但不使用Hivejdbc的方式,在导入两个xml之后只能读取到default这个数据库,按照诸多网上的教程,修改xml还是未能起到作用(hive不能称为一个数据库,只是习惯了,下次一定改)

01.文件拷贝

​ 上传core-site.xml,hive-site.xml到spark/conf目录下,core-site.xml在Hadoop种,hive-site.xml在hive中

(base) [root@192 conf]# ls -al
总用量 304
drwxr-xr-x.  2 zzjz zzjz   4096 325 08:25 .
drwxr-xr-x. 13 zzjz zzjz    211 23 2020 ..
-rw-r--r--.  1 root root   1529 325 08:24 core-site.xml
-rw-r--r--.  1 zzjz zzjz    996 23 2020 docker.properties.template
-rw-r--r--.  1 zzjz zzjz   1105 23 2020 fairscheduler.xml.template
-rw-r--r--.  1 root root 257572 325 08:25 hive-site.xml
-rw-r--r--.  1 zzjz zzjz   2025 23 2020 log4j.properties.template
-rw-r--r--.  1 zzjz zzjz   7801 23 2020 metrics.properties.template
-rw-r--r--.  1 zzjz zzjz    865 23 2020 slaves.template
-rw-r--r--.  1 zzjz zzjz   1292 23 2020 spark-defaults.conf.template
-rwxr-xr-x.  1 root root   4406 125 19:40 spark-env.sh
-rwxr-xr-x.  1 zzjz zzjz   4221 23 2020 spark-env.sh.template

02.pyspark测试

​ 使用pyspark读取hive数据库

from pyspark.sql import SparkSession
spark = SparkSession.builder.config("spark.driver.host","192.168.1.10")\
    .config("spark.ui.showConsoleProgress","false")\
    .appName("ReadHive").master("local[*]").getOrCreate()
spark.sql("show databases").show()

​ 输出:结果只显示default这个数据库

image-20220325084547724

​ 实际上hive数据库不只是default

03.尝试解决

3.1.在hive-site.xml中关闭版本验证(失败)

<property>
	<name>hive.metastore.schema.verification</name>
	<value>false</value>
</property>

​ 结果:并未起到作用

3.2.配置元数据库信息(失败)

​ 登陆mysql,我是将部署在docker容器中的mysql数据库作为hive的元数据库

​ 修改hive metastore版本(下面为原始情况,尝试过很多改动,都无济于事):

<property>
    <name>hive.metastore.uris</name>
    <value/>
    <description>Thrift URI for the remote metastore. Used by metastore client to connect to remote metastore.</description>
  </property>

​ 结果还是解决不了,还会报错

3.3.交互式环境测试(正常)

​ 使用交互式终端试试能不能查找到其他的数据库

scala> sc.setLogLevel("ERROR")

scala> spark.sql("show databases").show()
22/03/25 11:21:36 ERROR ObjectStore: Version information found in metastore differs 2.3.0 from expected schema version 1.2.0. Schema verififcation is disabled hive.metastore.schema.verification so setting version.
+-------------+
| databaseName|
+-------------+
|      default|
|hive_test_one|
|hive_test_two|
+-------------+


scala>

​ 结果:明显是可以的,那么问题就一定出现在自己的代码上

3.4.最终解决方案(成功)

​ 通过查看SparkSession的Builder类,找到一个一眼看上去就是的方法enableHiveSupport()

​ 看一下源码中的描述:

def enableHiveSupport(self):
	"""Enables Hive support, including connectivity to a persistent Hive metastore, support for Hive SerDes, 		and Hive user-defined functions.
    """
	return self.config("spark.sql.catalogImplementation", "hive")

​ 我们加上这个再次在pyspark中进行测试:

from pyspark.sql import SparkSession
spark = SparkSession.builder.config("spark.driver.host","192.168.1.10")\
    .config("spark.ui.showConsoleProgress","false")\
    .appName("ReadHive").master("local[*]").enableHiveSupport().getOrCreate()
spark.sql("show databases").show()

​ 结果:成功加载了其他的数据库

image-20220325113342025

​ 但是前面很多HiveConf的警告,使用sc设置日志级别

spark.sparkContext.setLogLevel("Error")

04.在idea上配置

4.1.文件放置

​ 首先就需要将之前的core-site.xml和hive-site.xml放置在resource目录下,由于这边log4j.properties有之前配的日志级别等,所以就不会像pycharm那样生成很多HiveConf的运行日志了

image-20220325113749714

4.2.代码测试

​ 同样加上enableHiveSupport()去Builder一个SparkSession对象

​ 下面使用Scala语言进行测试非default的hive_test_one表

package GadaiteGroupID.HiveSQLT

import org.apache.spark.sql.SparkSession

object ReadHive extends App {
  val spark = SparkSession.builder().config("spark,driver.host","192.168.1.10")
    .config("spark.ui.showConsoleProgress","false").master("local[*]")
    .appName("readhive").enableHiveSupport().getOrCreate()
  val HDF = spark.sql("select * from `hive_test_one`.`seeds_dataset`")
  HDF.show()
  HDF.printSchema()
}

​ 结果:能够输出

image-20220325114136791

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐