当完成了上面的步骤之后,在spaek-shell中,就可以访问hive了。
import org.apache.spark.sql.SparkSession val warehouseLocation = "spark-warehouse" val spark = SparkSession .builder() .appName("Spark Hive Example") .config("spark.sql.warehouse.dir", warehouseLocation) .enableHiveSupport() .getOrCreate() import spark.implicits._ import spark.sql // 到这里,你就可以随意读取Hive了 // test是hive中的表名 df = sql("select * from test") // 返回spaek的DataFrame df.show() // 这里可以用sql语句,对Hive中的数据表进行任何的读写操作 sql(".....")
当然,这是在集群中的任意一个节点服务器中执行。
因此,你也可以使用spark-submit的方式。
最后,spark访问hive为什么这么简单呢?基本不需要什么复杂的配置?
这是因为hive的元数据实际还是存放在hdfs,所以,你的hadoop和spark集群配置才是关键工作,spark访问的根头还是hdfs。
一、 Unable to instantiate SparkSession with Hive support because Hive classes are not found:
这个就是需要把spark-hive相关的包加到项目中。
坑人的是maven仓库官网中对spark-hive的引用是这样:
libraryDependencies += “org.apache.spark” %% “spark-hive” % “2.4.4” % “provided”
但是实际上,应该写成libraryDependencies += “org.apache.spark” %% “spark-hive” % “2.4.4”
二、Hive Schema version xxx does not match metastore’s schema version xxx Metastore is not upgraded or corrupt
解决方案:
1.登陆mysql,修改hive metastore版本:
进入mysql:mysql -uroot -p (123456)
use hive; select * from version; update VERSION set SCHEMA_VERSION='2.1.1' where VER_ID=1;
2.简单粗暴:在hvie-site.xml中关闭版本验证
<property> <name>hive.metastore.schema.verification</name> <value>false</value> </property>
三、Attempt to invoke the “HikariCP” plugin to create a ConnectionPool gave an error : The connection pool plugin of type “HikariCP” was not found in the CLASSPATH!
修改hive的数据库连接方式:
<property> <name>datanucleus.connectionPoolingType</name> <value>dbcp</value> <description> Expects one of [bonecp, dbcp, hikaricp, none]. Specify connection pool library for datanucleus </description> </property>