解决Spark读取Hive的数据库,只能读取到default
问题原因:按照网上的诸多博客等想使用Spark直接读取Hive,但不使用Hivejdbc的方式,在导入两个xml之后只能读取到default这个数据库,按照诸多网上的教程,修改xml还是未能起到作用(hive不能称为一个数据库,只是习惯了,下次一定改)01.文件拷贝上传core-site.xml,hive-site.xml到spark/conf目录下,core-site.xml在Hadoop种
问题原因:按照网上的诸多博客等想使用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 3月 25 08:25 .
drwxr-xr-x. 13 zzjz zzjz 211 2月 3 2020 ..
-rw-r--r--. 1 root root 1529 3月 25 08:24 core-site.xml
-rw-r--r--. 1 zzjz zzjz 996 2月 3 2020 docker.properties.template
-rw-r--r--. 1 zzjz zzjz 1105 2月 3 2020 fairscheduler.xml.template
-rw-r--r--. 1 root root 257572 3月 25 08:25 hive-site.xml
-rw-r--r--. 1 zzjz zzjz 2025 2月 3 2020 log4j.properties.template
-rw-r--r--. 1 zzjz zzjz 7801 2月 3 2020 metrics.properties.template
-rw-r--r--. 1 zzjz zzjz 865 2月 3 2020 slaves.template
-rw-r--r--. 1 zzjz zzjz 1292 2月 3 2020 spark-defaults.conf.template
-rwxr-xr-x. 1 root root 4406 1月 25 19:40 spark-env.sh
-rwxr-xr-x. 1 zzjz zzjz 4221 2月 3 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这个数据库
实际上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()
结果:成功加载了其他的数据库
但是前面很多HiveConf的警告,使用sc设置日志级别
spark.sparkContext.setLogLevel("Error")
04.在idea上配置
4.1.文件放置
首先就需要将之前的core-site.xml和hive-site.xml放置在resource目录下,由于这边log4j.properties有之前配的日志级别等,所以就不会像pycharm那样生成很多HiveConf的运行日志了
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()
}
结果:能够输出
更多推荐
所有评论(0)