SparkSQL整合Hive

spark-sql可以直接使用hive的元数据

1、环境搭建如下:

java 复制代码
## 1、启动hive的元数据服务

```shell
# 1、修改hive的配置文件
cd /usr/local/soft/hive-3.1.3/conf

# 2、增加配置
vim hive-site.xml

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

# 3、启动hive元数据服务
nohup  hive --service metastore >> metastore.log 2>&1 &
```

## 2、将hive的配置文件同步到spark conf目录下

```sql
cp hive-site.xml /usr/local/soft/spark-3.1.3/conf/
```

### 3、在spark sql命令行中使用hive的表

```shell
#命令行启动spark-sql
spark-sql --master local

#指定分区数为1
set spark.sql.shuffle.partitions=1;

create external table if not exists students(
    id bigint comment '学生id'
    ,name string comment '学生姓名'
    ,age bigint comment '学生年龄'
    ,sex string comment '学生性别'
    ,clazz string comment '学生班级'
) comment '学生信息表'
row format delimited fields terminated by ','
stored as textfile 
location 'hdfs://master:9000/data/student';

select clazz,count(1) as num from students
group by clazz;
```

2、在代码中写spark-sql

java 复制代码
import org.apache.spark.SparkContext
import org.apache.spark.rdd.RDD
import org.apache.spark.sql.{DataFrame, Dataset, Row, SparkSession}

object Demo1DataFrame {
  def main(args: Array[String]): Unit = {

    //1、创建spark sql环境
    val spark: SparkSession = SparkSession
      .builder()
      .master("local")
      .appName("df")
      //指定shuffle之后RDD的分区数
      .config("spark.sql.shuffle.partitions", 1)
      .getOrCreate()

    import spark.implicits._

    //2、读取数据
    //DataFrame:在RDD的基础上增加了表结构,为了写sql
    val studentDF: DataFrame = spark
      .read
      .format("csv")
      .option("sep", ",")
      .schema("id STRING,name STRING,age INT,sex STRING,clazz STRING")
      .load("data/students.txt")

    //查看数据
    studentDF.show()

    //创建临时视图
    studentDF.createOrReplaceTempView("students")

    //编写sql处理数据
    val clazzNumDF: DataFrame = spark.sql(
      """
        |select clazz,count(1) as num
        |from students
        |group by clazz
        |""".stripMargin)

    clazzNumDF.show()

    import org.apache.spark.sql.functions._
    //使用DSL处理数据
    val clazzNum: DataFrame = studentDF
      .groupBy("clazz")
      .agg(count("id") as "num")

    //保存结果
    clazzNum
      .write
      .format("csv")
      .option("sep", "\t")
    //.save("data/clazz_num")

    //使用RDD处理数据
    val kvDS: RDD[(String, Int)] = studentDF
      //转换成RDD
      .rdd
      .map {
        //DF中的每一行是一个ROW对象
        case Row(id, name, age, sex, clazz: String) => (clazz, 1)
      }

    kvDS
      .reduceByKey(_ + _)
      .foreach(println)

  }
}
相关推荐
得物技术7 小时前
深入剖析Spark UI界面:参数与界面详解|得物技术
大数据·后端·spark
肌肉娃子4 天前
20260227.spark.Spark 性能刺客:千万别在 for 循环里写 withColumn
spark
B站计算机毕业设计超人5 天前
计算机毕业设计Django+Vue.js音乐推荐系统 音乐可视化 大数据毕业设计 (源码+文档+PPT+讲解)
大数据·vue.js·hadoop·python·spark·django·课程设计
tryCbest5 天前
数据库SQL学习
数据库·sql
十月南城5 天前
数据湖技术对比——Iceberg、Hudi、Delta的表格格式与维护策略
大数据·数据库·数据仓库·hive·hadoop·spark
王九思5 天前
Hive Thrift Server 介绍
数据仓库·hive·hadoop
cowboy2585 天前
mysql5.7及以下版本查询所有后代值(包括本身)
数据库·sql
努力的lpp5 天前
SQL 报错注入
数据库·sql·web安全·网络安全·sql注入
麦聪聊数据5 天前
统一 Web SQL 平台如何收编企业内部的“野生数据看板”?
数据库·sql·低代码·微服务·架构
山峰哥5 天前
吃透 SQL 优化:告别慢查询,解锁数据库高性能
服务器·数据库·sql·oracle·性能优化·编辑器