首页 > 数据库 >spark sql的知识碎片

spark sql的知识碎片

时间:2024-07-16 22:07:17浏览次数:16  
标签:函数 -- DataFrame 碎片 sql spark String

spark sql

Apache Spark SQL 是 Apache Spark 中用于结构化数据处理的模块。它允许在大规模数据集上运行 SQL 查询,提供数据查询、分析和转换的能力。Spark SQL 与 Spark 核心集成,允许你将 SQL 查询与其他 Spark 函数结合使用。

主要特点:

  1. DataFrame 和 Dataset:
    • DataFrame 是一种以命名列组织的分布式数据集合,类似于关系数据库中的表。
    • Dataset 是类型化的分布式数据集合,提供编译时类型安全性。
  2. SQL 查询:
    • 可以使用标准 SQL 语法在 DataFrame 和 Dataset 上执行查询。
    • 支持与 Hive 集成,能够查询 Hive 表。
  3. 数据源支持:
    • 支持多种数据源,如 JSON、Parquet、Avro、ORC、JDBC 等。
    • 可以轻松地将数据从各种存储系统(如 HDFS、Cassandra、HBase、S3 等)加载到 Spark 中。
  4. Catalyst 优化器:
    • Spark SQL 使用 Catalyst 优化器来自动优化查询,生成高效的执行计划,从而提高查询性能。
  5. 统一的数据访问接口:
    • 提供统一的 API 来访问不同的数据源和格式,简化数据操作和处理流程。

spark sql处理数据的步骤:

  1. 读取数据源
  2. 将读取到的DF注册成一个临时视图
  3. 使用sparkSession的sql函数,编写sql语句操作临时视图,返回的依旧是一个DataFrame
  4. 将结果写道hdfs上

如何在spark sql中使用rdd编程

spark sql 是spark core的上层api,如果要想使用rdd的编程,可以直接通过sparkSession获取SparkContext对象

在使用sparkSession获取SparkContext对象后使用println打印不出来结果,需要使用show函数展示结果

可以使用printSchema函数来查看表的结构

sql语句是无法直接作用在DataFrame上面的,需要提前将要使用sql分析的DataFrame注册成一张表(临时视图)

可以编写sql语句作用在临时视图上,sql语法是完全兼容hive语法

spark DSL & API

如果要想使用DSL语法编写spark sql的话,需要导入两个隐式转换

// 将sql中的函数,封装成spark程序中的一个个的函数直接调用,以传参的方式调用
import org.apache.spark.sql.functions._
// 主要作用是,将来可以在调用的函数中,使用$函数,将列名字符串类型转成一个ColumnName类型,而ColumnName是继承自Column类的
import sparkSession.implicits._

读取json数据文件,转成DF

读取json数据的时候,是不需要指定表结构,可以自动的根据json的键值来构建DataFrame

使用show()函数打印时,默认显示20行数据,可以在括号内赋予numRows值,返回想要得到的行数

select函数

类似于纯sql语法中的select关键字,传入要查询的列

selectExpr函数

与select功能差不多的查询函数,如果要以传字符串的形式给到select的话,并且还想对列进行表达式处理的话,可以使用selectExpr函数

where函数

===:类似于sql中的=等于某个值

=!=:类似于sql中!=或者<> 不等于某个值

groupBy函数

非分组字段使无法出现在select查询语句中的

orderBy函数

按照某个字段进行排序

开窗函数

无论是在纯sql中还是在DSL语法中,开窗是不会改变原表条数

sparksql数据源读写

可以读写csv格式的数据:

可以直接使用.csv文件的函数读取

也可以使用format的形式读取,可以设置表的结构

读取json文件

使用.json的函数读取json文件,json文件会自动根据键值对创建列和列名

也可以用.json函数写出json文件

去写parquet格式文件

parquet格式的文件存储,是由【信息熵】决定的,极大的减小存储空间

DataFrame与RDD的相互转换

  def main(args: Array[String]): Unit = {
    val sparkSession: SparkSession = SparkSession.builder()
      .master("local")
      .appName("rdd与df之间的转换")
      .config("spark.sql.shuffle.partitions", "1")
      .getOrCreate()

    //通过SparkSession获取sparkContext对象
    val sparkContext: SparkContext = sparkSession.sparkContext

    //作用1:使用$函数
    //作用2:可以在不同的数据结构之间转换
    import sparkSession.implicits._

    /**
     * spark core的核心数据结构是:RDD
     * spark sql的核心数据结构是DataFrame
     */
    // RDD->DataFrame  .toDF
    val linesRDD: RDD[String] = sparkContext.textFile("spark/data/students.txt")
    val stuRDD: RDD[(String, String, String, String, String)] = linesRDD.map((line: String) => {
      line.split(",") match {
        case Array(id: String, name: String, age: String, gender: String, clazz: String) =>
          (id, name, age, gender, clazz)
      }
    })
    val resRDD1: RDD[(String, Int)] = stuRDD.groupBy(_._5)
      .map((kv: (String, Iterable[(String, String, String, String, String)])) => {
        (kv._1, kv._2.size)
      })
    val df1: DataFrame = resRDD1.toDF
    val df2: DataFrame = df1.select($"_1" as "clazz", $"_2" as "counts")
    df2.printSchema()

    // DataFrame->RDD  .rdd
    val resRDD2: RDD[Row] = df2.rdd
//    resRDD2.map((row:Row)=>{
//      val clazz: String = row.getAs[String]("clazz")
//      val counts: Integer = row.getAs[Integer]("counts")
//      s"班级:$clazz, 人数:$counts"
//    }).foreach(println)

    resRDD2.map {
      case Row(clazz:String, counts:Integer)=>
        s"班级:$clazz, 人数:$counts"
    }.foreach(println)

spark-sql 写代码方式

  1. idea里面将代码编写好打包上传到集群中运行,上线使用

    --conf spark.sql.shuffle.partitions=1 -- 设置spark sqlshuffle之后分区数据马,和代码里面设置是一样的,代码中优先级高
    spark-submit提交
    spark-submit --master yarn-client --class com.shujia.sql.Demo8SubmitYarn --conf spark.sql.shuffle.partitions=1 spark-1.0.jar 
    
    //新版本spark提交yarn的命令
    spark-submit --master yarn --deploy-mode client --class xxx.xxx.xxx --conf spark.sql.shuffle.partitions=100 spark-1.0.jar 
    
  2. spark shell (repl) 里面使用sqlContext 测试使用,简单任务使用

  3. spark-sql spark-sql --master yarn --deploy-mode client 不能使用yarn-cluster 和hive的命令行一样,直接写sql

标签:函数,--,DataFrame,碎片,sql,spark,String
From: https://www.cnblogs.com/yulugoat/p/18306228

相关文章

  • MySQL【表完整性约束】
    约束条件说明primarykey(PK)标识该字段为该表的主键,唯一性,不为空;UNIQUE+NOTNULLforeignkey(FK)标识该字段为该表的外键,实现表与表之间的关联null标识是否允许为空,默认为NULL。notnull标识该字段不能为空,可以修改。uniquekey(UK)标识该字段的值是唯一的......
  • MySQL【源码安装安装 mysql】
    1.当前目录:修改属主属组cd/usr/local/mysqlchown-Rmysql.mysql.2.初始化数据库:mysql/bin/mysqld./bin/mysqld--initialize--user=mysql--basedir=/usr/local/mysql--datadir=/usr/local/mysql/data/#拿到随机密码:#[Note]Atemporarypasswordisgeneratedf......
  • WPF read data from mysql and display via ADO.NET
    //xaml<Windowx:Class="WpfApp216.MainWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d="http://schemas.mi......
  • SQL常用数据过滤---IN操作符
     在SQL中,IN操作符常用于过滤数据,允许在WHERE子句中指定多个可能的值。如果列中的值匹配IN操作符后面括号中的任何一个值,那么该行就会被选中。以下是使用IN操作符的基本语法:SELECT column1, column2, ... FROM table_name WHERE column_name IN (value1, value2......
  • SQL常用数据过滤---IN操作符
    在SQL中,IN操作符常用于过滤数据,允许在WHERE子句中指定多个可能的值。如果列中的值匹配IN操作符后面括号中的任何一个值,那么该行就会被选中。 以下是使用IN操作符的基本语法:SELECTcolumn1,column2,...FROMtable_nameWHEREcolumn_nameIN(value1,value2,...); ......
  • MySQL主从复制过程
    1、主库操作:修改数据库配置文件liunx的my.cnf文件;windows系统的my.ini文件[mysqld]#最大链接数max_connections=1000#主库----start---同一局域网内注意要唯一server-id=100#开启二进制日志功能,可以随便取(关键)log-bin=mysql-bin#记录的数据库(多数据库用逗号......
  • MySQL 索引
    MySQL索引一、介绍二、索引的分类三、单列索引、组合索引四、全文索引五、空间索引六、索引的原理、优缺点、创建原则一、介绍索引是通过某种算法,构建出一个数据模型,用于快速找出在某个列中有一特定值的行,不使用索引,MySQL必须从第一条记录开始读完整个表,直到找出相关的......
  • MySQL数据库一主一从集群配置
    环境环境三部曲1.全新服务器-互相通信2.全新安装mysql8.0-分别安装3.配置域名解析这里来讲一主一从的第二种连接方式,第一种的话可以参考下面连接:第一种方式一主一从(M-S)(2)需求实验2与上一个实验需求基本相同。master1作为主mysqlmaster2作为从mysql。不同之......
  • MySQL 数据库 day 7.16
        ok了家人们今天继续记录一下数据库,看看今天学了什么。一.事物概述1.1环境准备--账户表createtableaccount(idintprimarykeyauto_increment,namevarchar(20),moneydouble);insertintoaccountvalues(null,'张三',1000......
  • sqldumper.exe 是 SQL Server 的一个重要组件,专门用于捕获和处理关键错误,帮助管理员和
     sqldumper.exe的起源可以追溯到MicrosoftSQLServer的开发和运行时管理中。它作为SQLServer的一部分,主要用于处理数据库引擎遇到的关键错误和异常情况。具体来说,sqldumper.exe主要功能包括:异常处理和故障捕获:当SQLServer数据库引擎遇到严重错误时,如内存访问错误......