SparkSql拉取Hive上的数据

想要读取Hive的数据我们首先要从集群中把需要的xml文件获取下来,分别是core-site.xml、hdfs-site.xml、hive-site.xml,将这三个文件放在项目的resource目录下,spark运行的时候会自动读取

在原本的Spark pom文件中导入spark-hive的包,大家根据自己的scala和spark的版本去选择自己合适的,我用的如下

		<dependency>
            <groupId>org.apache.spark</groupId>
            <artifactId>spark-hive_2.11</artifactId>
            <version>2.0.2</version>
        </dependency>

这种方法读取时,只是SparkSession的创建有些不一样罢了,其他的操作没什么异样,代码如下

package com.sparksql

import org.apache.spark.sql.SparkSession

object SparkOnHive {
  def main(args: Array[String]): Unit = {
    //hive的表数据文件在hdfs上的存放地址,如果你的hive-env里面有hive表数据位置就不用配置这一项
    val warehouseLocation = "hdfs://hdp2:9000/user/hive/warehouse"

    val spark = SparkSession
      .builder()
      .appName("Spark Hive Example")
      .master("local")
      .config("spark.sql.warehouse.dir", warehouseLocation)//我的hive配置文件里没写表数据存放地址用的是hive自己默认的路径,所以我要另外修改sparksql-hive的table数据源,指定到hive表数据去
      .enableHiveSupport()
      .getOrCreate()

    import spark.sql

	//测试,spark会自动读取配置
    sql("CREATE TABLE IF NOT EXISTS src (key INT, value STRING)")
    sql("LOAD DATA LOCAL INPATH 'examples/src/main/resources/kv1.txt' INTO TABLE src")
    sql("SELECT * FROM src").show()
    sql("SELECT avg(age) avgage FROM student").show()
  }
}

这里解释一下,Spark操作Hive数据的时候,三个配置文件,如果你没有hive-site.xml,Spark会自动使用内置的hive环境,如果你是在开发工具中直接运行代码,你会发现在项目主路径下会生成hive自带的元数据库,就是那个不支持高并发的基于文件的元数据库。

如果没有另外两个Hadoop的配置文件,而且还没有配置HADOOP_HOME,那么就会报错找不到配置文件之类的,如果此时配置了HADOOP_HOME,则是用你本地的HADOOP测试环境,不过因为本地只是测试跑代码之类的,所以一般也不去本地的HADOOP上配置东西,导致它用的都是默认的配置,

我上面写的代码是Spark融合了Sqlsession和hiveSession产生了SparkSession之后的写法,现在任然有很多人喜欢使用以前的写法,博文开始pom中让大家导入的那个spark-hive的jar中任然支持老旧的写法,我也给大家找了一个旧API的写法

	val sparkConf=new SparkConf()
    sparkConf.setAppName("SQLContextApp").setMaster("local[2]")
    val sc= new SparkContext(sparkConf)

    val hiveContext=new HiveContext(sc)

	//下面的操作,和SqlSession没差别
    hiveContext.table("emp").show

不过这个API,它在2.0.0版本的jar开始就过时了,不建议大家使用

最后给大家看一下,如果你不导入三个配置文件,则会生成如下的路径,一个是hive元数据另一个是spark操作hive时的数据存放路径
在这里插入图片描述

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
首先,你需要在Spark中启用Kafka Stream,以便从Kafka主题中数据。然后,使用Spark SQL和DataFrame API对数据进行处理和分析。最后,你可以将分析结果存储到Hive中。 以下是一些基本步骤: 1. 在pom.xml或build.gradle中添加Kafka和Spark Streaming依赖项。 2. 创建一个KafkaStream,设置Kafka连接参数和主题名称,并使用Spark Streaming API数据。 3. 使用Spark SQL将KafkaStream转换为DataFrame,并对其进行清理和转换。 4. 使用DataFrame API或SQL查询对数据进行分析和计算。 5. 将结果写入Hive表中,以便进一步查询和分析。 以下是一些示例代码: ```scala import org.apache.spark.streaming.kafka._ import org.apache.spark.streaming._ import org.apache.spark.sql._ val ssc = new StreamingContext(sparkConf, Seconds(5)) val kafkaParams = Map[String, String]( "bootstrap.servers" -> "localhost:9092", "key.deserializer" -> classOf[StringDeserializer].getName, "value.deserializer" -> classOf[StringDeserializer].getName, "group.id" -> "traffic_group" ) val topics = Array("traffic_data") val stream = KafkaUtils.createDirectStream[String, String]( ssc, LocationStrategies.PreferConsistent, ConsumerStrategies.Subscribe[String, String](topics, kafkaParams) ) // 将KafkaStream转换为DataFrame val df = stream.map(_.value).toDF() // 对DataFrame进行清理和转换 val cleanedDf = df.select( from_json(col("value"), trafficSchema).as("traffic") ).selectExpr("traffic.*") // 对数据进行分析和计算 val resultDf = cleanedDf.groupBy("road").agg(avg("speed"), max("volume")) // 将结果写入Hive表中 resultDf.write.mode("overwrite").saveAsTable("traffic_analysis") ``` 上面的示例代码演示了从Kafka主题中交通数据,并使用Spark SQL和DataFrame API进行分析和计算,然后将结果写入Hive表中。你需要根据你的数据和需求进行适当的修改和调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值