Spark连接hive的多种方式,并处理数据

2022-09-02 11:58:59

大家都知道,Spark可以和各种数据库进行连接并读取数据,今天就说说如何连接hive并读取数据。

方法一:在IDEA中连接hive

在pom.xml中添加依赖
导入mysql的驱动包和spark连接hive的驱动包

<dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.38</version></dependency><dependency><groupId>org.apache.spark</groupId><artifactId>spark-hive_2.11</artifactId><version>2.3.4</version></dependency><dependency><groupId>org.apache.spark</groupId><artifactId>spark-core_2.11</artifactId><version>2.3.4</version></dependency><dependency><groupId>org.apache.spark</groupId><artifactId>spark-sql_2.11</artifactId><version>2.3.4</version></dependency>

在main主目录下创建一个resources文件夹,创建好后右键单击,选择Make Directory as,选择Resources Root选项,接下来就是把配置文件放到这个文件夹下;
前面已经讲过配置hadoop和hive,在这里就不多说了;
把hadoop的配置文件hdfs-site.xml core-site.xml和hive的配置文件hive-site.xml复制到resources文件夹下;

hadoop的配置文件在hadoop260/etc/hadoop目录下;
hive的配置文件在hive110/conf目录下
在这里插入图片描述
如图所示的位置;
然后在hive-site.xml中修改jdbc的url的ip为自己主机的ip地址
配置好以上信息后,启动hive就不多说了,然后选择一个数据库和其中一张表,先查看数据,查询完有数据时,回到IDEA中,创建scala目录并新建一个object类,接下来开始连接hive

import org.apache.spark.sql.SparkSession

object MyHiveSpark{

  defmain(args: Array[String]): Unit={
    val spark= SparkSession.builder().master("local[*]").appName("spark_hive").enableHiveSupport().getOrCreate()
    val df= spark.sql("select * from userinfos.user")
    df.show()}}

注意:
sql语句中有点不一样,就是查询的时候要带上数据库名.表名的语法

这样就能查询hive中的数据

方法二:在Linux系统下连接hive

1.把上面那所说的三个配置文件复制到spark/conf的文件下

cp/opt/soft/hive110/conf/hive-site.xml/opt/soft/spark240/conf/
cp/opt/soft/hadoop260/etc/hadoop/core-site.xml/opt/soft/spark240/conf/
cp/opt/soft/hadoop260/etc/hadoop/hdfs-site.xml/opt/soft/spark240/conf/

2.把mysql的驱动包和spark连接hive的驱动包复制到spark240/jars文件夹里

3.驱动包可以到本地maven仓库中去找,直接拖到上面所说的地方,在这里就不多说了,也可以去hive的lib下去找驱动包。

4.启动spark并进入shell界面,前面在讲spark安装的时候有说过如何启动,可以自己去看

Spark简介以及最详细安装教程

cd/opt/soft/spark240/bin./spark-shellimport org.apache.spark.sql.hive.HiveContext
val hiveContext=newHiveContext(sc)
hiveContext.sql("select * from test").show()

或者直接使用Spark Session 中创建好的对象spark去直接把hive中的表加载成dataframe。
只需要在hive-site.xml中添加一个配置就行

<property><name>hive.metastore.uris</name><value>thrift://spark1:9083</value></property>

这样在spark-shell下可直接访问Hive中的表hive_table

val df=spark.table("hive_table")
df.printSchema
df.show

注意:
1.一定要先启动hive元数据服务:hive --service metastore
2.hive-site.xml拷贝至${SPARK_HOME}/conf下并添加配置
如图所示,这样就能查询到hive中的数据了!
注意:
在执行hiveContext.sql(“select * from test”).show() 会报一个异常:

The root scratch dir:/tmp/hive on HDFS should be writable.
Current permissions are: rwxr-xr-x

如下图所式:
在这里插入图片描述
解决办法:
更改HDFS目录/tmp/hive的权限

hadoop fs-chmod777/tmp/hive

同时删HDFS与本地的目录/tmp/hive

hadoop fs-rm-r/tmp/hive

方法三:使用SparkSQL连接hive

同样先添加依赖就不都说了
这种方式通过指定config的话就不用再配置那三个.xml文件了,就方便很多

defmain(args: Array[String]): Unit={
 valArray(inpath, dt, hour)= args
 val conf=newSparkConf().setAppName(this.getClass.getSimpleName)//.setMaster("local[*]").setMaster("spark://192.168.5.150:7077")

 val spark= SparkSession.builder().config(conf)// 指定hive的metastore的端口  默认为9083 在hive-site.xml中查看.config("hive.metastore.uris","thrift://192.168.5.150:9083")//指定hive的warehouse目录.config("spark.sql.warehouse.dir","hdfs://192.168.5.150:9000/user/hive/warehouse")//直接连接hive.enableHiveSupport().getOrCreate()import spark.implicits._
val df1: DataFrame= spark.sql("select * from user") 
df1.printSchema()
df1.show()
  • 作者:天ヾ道℡酬勤
  • 原文链接:https://blog.csdn.net/zp17834994071/article/details/107771168
    更新时间:2022-09-02 11:58:59