Spark中SparkSQL的基础用法

本文详细介绍如何使用SparkSQL处理非结构化数据,包括两种不同版本的实现方式:Spark1.x和Spark2.x。从创建配置对象到处理数据,再到执行SQL查询,提供了完整的代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

SparkSQL其实说白了就是方便开发人员对RDD进行间接的操作,之我前在阿里巴巴架构数据中台的时候本来想随笔的写写今天有时间就随便写点。SparkSQL中的DataFrame本质上还是一个RDD但是DataFrame本质上又是一个DataSet,SparkSQL的中心是一个SparkCore,SparkCorez中RDD是核心。不说了直接上

第一种写法使用spark1.x版本

package com.alibaba.Test

import org.apache.spark.rdd.RDD
import org.apache.spark.sql.{DataFrame, SQLContext}
import org.apache.spark.{SparkConf, SparkContext}

object SparkSQLDemo1 {

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

    /**
      * 创建spark的配置对象sparkConf
      *
      */
    val sparkConf: SparkConf = new SparkConf().setAppName("SparkSQLDemo1").setMaster("local");

    /**
      * 创建spark的全文对象
      *
      */
    val sparkContext: SparkContext = new SparkContext(sparkConf);

    /**
      * 创建sparkSQL的对象
      */
    val sqlContext = new SQLContext(sparkContext);

    //读取外部的非结构化的数据
    val strRdd: RDD[String] = sparkContext.textFile("hdfs://xx.xx.xx.xx:10200/User.txt");

    //处理读取到的每一行的数据
    val userInfoRdd: RDD[UserInfo] = strRdd.map(line => {
      var lines = line.split(",");
      var id: Long = lines(0).toLong;
      var username: String = lines(1).toString;
      var age: Int = lines(2).toInt;
      var sex: String = lines(3).toString;
      var address: String = lines(4).toString;
      UserInfo(id, username, age, sex, address);
    });

    //将userinfoRdd转换为DataFream对象,通过调用toDF
    import sqlContext.implicits._
    val df: DataFrame = userInfoRdd.toDF;

    //注册一个虚拟的表
    df.registerTempTable("t_userinfo");

    //编写sql语句交给sqlContext执行,此时代码执行完以后这里仍然是个Tramsformation
    val res: DataFrame = sqlContext.sql("select * from t_userinfo order by age desc");

    //显示结果
    res.show();

    //终止spark本地进程
    sparkContext.stop();

  }
}

/**
  * 定义一个样例类
  * @param id
  * @param username
  * @param age
  * @param sex
  * @param address
  */
case class UserInfo(id:Long,username:String,age:Int,sex:String,address:String);

第二种写法使用spark1.x版本的

package com.alibaba.Test

import org.apache.spark.rdd.RDD
import org.apache.spark.sql.types._
import org.apache.spark.sql.{DataFrame, Row, SQLContext}
import org.apache.spark.{SparkConf, SparkContext}

object SparkSQLDemo1 {

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

    /**
      * 创建spark的配置对象sparkConf
      *
      */
    val sparkConf: SparkConf = new SparkConf().setAppName("SparkSQLDemo1").setMaster("local");

    /**
      * 创建spark的全文对象
      *
      */
    val sparkContext: SparkContext = new SparkContext(sparkConf);

    /**
      * 创建sparkSQL的对象
      */
    val sqlContext = new SQLContext(sparkContext);

    //读取外部的非结构化的数据
    val strRdd: RDD[String] = sparkContext.textFile("hdfs://xx.xx.xx.xx:10200/User.txt");

    //处理读取到的每一行的数据
    val userInfoRdd = strRdd.map(line => {
      var lines = line.split(",");
      var id: Long = lines(0).toLong;
      var username: String = lines(1).toString;
      var age: Int = lines(2).toInt;
      var sex: String = lines(3).toString;
      var address: String = lines(4).toString;
      Row(id, username, age, sex, address);
    })

    //定义一个用于定义虚拟表字段的类型和结构的对象类似于sql中建表时的字段描述
    //这是一种写法,还有一种写法
    val structType: StructType  = StructType(
        //参数一:字段的名称、参数二:字段的类型、参数三字段是否可以为空
        StructField("id",LongType,true) ::
        StructField("username", StringType, true) ::
        StructField("age", IntegerType, true) ::
        StructField("sex", StringType, true) ::
        StructField("sex", StringType, true) :: Nil
    )
    //第二种写法
    var structType1: StructType = StructType(List(
        StructField("id",LongType,true),
        StructField("username", StringType, true),
        StructField("age", IntegerType, true),
        StructField("sex", StringType, true),
        StructField("sex", StringType, true)
    ))

    //将userinfoRdd转换为DataFream对象,通过调用toDF
    val df: DataFrame = sqlContext.createDataFrame(userInfoRdd,structType1);

    //注册一个虚拟的表
    df.registerTempTable("t_userinfo");

    //编写sql语句交给sqlContext执行,此时代码执行完以后这里仍然是个Tramsformation
    val res: DataFrame = sqlContext.sql("select * from t_userinfo order by age desc");

    //显示结果
    res.show();

    //终止spark本地进程
    sparkContext.stop();

  }
}
下面是SparkSQL2.x版本的写法,sparkSQL2.x的版本其他的基本一样知识API发生了略微的变化,创建的对象由原先的SqlContext对象变成了SparkSession,spark2.x也可以完美的兼容spark1.x的

具体的写法:

package com.alibaba.Test

import org.apache.spark.rdd.RDD
import org.apache.spark.sql.types._
import org.apache.spark.sql.{DataFrame, Dataset, Row, SparkSession}

/**
  * sparkSQL2.x版本
  */
object SparkSQLDemo2 {

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

    /**
      * 2.x主要是用SparkSession对象来构建
      * sparkSession对象对sparkContext对象做了一次封装
      */
    val sparkSession: SparkSession = SparkSession
      .builder()
      .appName("SparkSQLDemo2")
      .master("local")
      .getOrCreate();

    //读取数据
    val readText: RDD[String] = sparkSession.sparkContext.textFile("hdfs://xx.xx.xx.xx:10200/User.txt");

    //处理数据
    val userInfoRdd: RDD[Row] = readText.map(line => {
      var lines = line.split(",");
      var id: Long = lines(0).toLong;
      var username: String = lines(1).toString;
      var age: Int = lines(2).toInt;
      var sex: String = lines(3).toString
      var address: String = lines(4).toString
      Row(id, username, age, sex, address)
    });

    //定义数据的描述类型
    var structType = StructType(
      StructField("id",LongType,true)::
      StructField("username",StringType,true) ::
      StructField("age",IntegerType,true) ::
      StructField("sex",StringType,true) ::
      StructField("address",StringType,true) :: Nil
    );

    val result: DataFrame = sparkSession.createDataFrame(userInfoRdd, structType);

    //注意这里要隐式的转换一下
    import sparkSession.implicits._
    val res: Dataset[Row] = result.where("id > 1").orderBy($"age" desc);

    res.show();

    sparkSession.stop();
  }
}

好了基础的写法嘛就随便写写即可。对于spark更深层次的以后慢慢想写了会补点的。

### 回答1: Spark SQLSpark生态系统中的一个组件,它提供了一种用于结构化数据处理的高级数据处理接口。Spark SQL支持使用SQL语言进行数据查询和处理,并且可以与Spark的其他组件(如Spark Streaming、MLlib等)无缝集成。Spark SQL还支持使用DataFrame API进行数据处理,这使得开发人员可以使用Scala、Java、Python和R等编程语言进行数据处理。Spark SQL还支持将数据存储在各种数据源中,如Hive、JSON、Parquet等。Spark SQL的主要优点是可以处理大规模的结构化数据,并且具有高性能和可扩展性。 ### 回答2: SparkSQL是Apache Spark中的一种组件,它用于处理结构化和半结构化数据。与传统的Spark核心功能相比,SparkSQL提供了更高级的数据处理工具,使得用户可以使用SQL查询和操作结构化数据。 SparkSQL的基本概念包括DataFrame和Dataset。DataFrame是强类型的分布式数据集,它可以看作是一个表,每一列都有一个名字和数据类型。Dataset是比DataFrame更加丰富的API,它可以以编程的方式进行查询和操作数据。 SparkSQL支持使用标准的SQL查询语言进行数据查询和聚合。用户可以编写SQL语句来过滤、聚合和排序数据,并通过SparkSQL将结果存储在DataFrame或Dataset中。 SparkSQL还支持多种数据格式的读取和写入,包括Parquet、Avro、JSON和CSV等。用户可以通过提供Schema来从这些格式中读取数据,并可以选择将数据以这些格式写入磁盘。 另外,SparkSQL还提供了与Hive的集成,使得用户可以使用Hive的元数据和UDF函数。用户可以通过SparkSQL查询Hive表,并将查询结果存储在Hive表中。 SparkSQL还支持缓存数据以提高查询性能。用户可以使用DataFrame或Dataset的persist()方法将数据持久化到内存或磁盘中,并可以通过调用unpersist()方法来释放缓存的数据。 总结来说,SparkSQL是Apache Spark中用于处理结构化和半结构化数据的组件,它提供了DataFrame和Dataset的概念,支持使用SQL语言进行数据查询和聚合,以及多种数据格式的读写,还具备与Hive的集成以及数据缓存等功能。 ### 回答3: Spark SQL是Apache Spark的一个模块,它提供了用于处理结构化数据的SQL查询和集成,使得在Spark中可以方便地进行数据处理和分析。 Spark SQL的核心是DataFrames,它是一种可处理具有命名列的分布式数据集的数据结构。DataFrames可以由多种数据源创建,包括结构化数据、Parquet文件、JSON文件、Hive表等。与传统的RDD相比,DataFrames具有更高的性能和更强的优化能力,因为它们提供了类似于传统数据库的结构化查询API。 通过Spark SQL,我们可以使用标准的SQL查询语言来查询和操作DataFrames中的数据。Spark SQL支持常见的SQL操作,如SELECT、JOIN、GROUP BY等,还支持用户自定义函数和聚合函数的定义。这使得开发人员可以使用熟悉的SQL语法来处理和分析数据,无需编写复杂的MapReduce或Spark程序。 除了SQL查询,Spark SQL还提供了用于将DataFrames转换为RDD的接口,以及将RDD转换为DataFrames的接口。这使得在需要深度定制数据处理逻辑时可以灵活地切换和使用两者之间的API。 总之,Spark SQL是一个强大而灵活的数据处理工具,它通过提供SQL查询和集成的方式,使得在Spark中可以方便地处理和分析结构化数据。它不仅提供了与传统数据库类似的性能和优化能力,还提供了与Spark的其他组件(如MLlib和GraphX)的无缝集成,使得在Spark平台上进行大规模数据处理变得更加简单和高效。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值