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)

  }
}
相关推荐
uesowys6 小时前
Apache Spark算法开发指导-特征转换RobustScaler
spark·特征转换·robustscaler
小至尖尖7 小时前
fastdbchkrep项目(数据库自动生成巡检报告) open source
sql·sql优化
努力成为一个程序猿.9 小时前
【问题排查】hadoop-shaded-guava依赖问题
大数据·hadoop·spark
·云扬·10 小时前
MySQL主从数据一致性校验工具:pt-table-checksum 详解
数据库·sql·mysql
那我掉的头发算什么10 小时前
【数据库】事务
数据库·sql·mysql·github·数据库开发
wudl556611 小时前
Flink SQL连接Kafka及数据去重操作
sql·flink·kafka
yumgpkpm13 小时前
CMP(类ClouderaCDP7.3(404次编译) )完全支持华为鲲鹏Aarch64(ARM)使用 AI 优化库存水平、配送路线的具体案例及说明
大数据·人工智能·hive·hadoop·机器学习·zookeeper·cloudera
~kiss~13 小时前
spark-SQL学习
sql·学习·spark
GottdesKrieges14 小时前
OceanBase集群诊断工具:obdiag
数据库·sql·oceanbase