Spark SQL 2.4.8 操作 Dataframe的两种方式


Posted in SQL Server onOctober 16, 2021

一、测试数据

7369,SMITH,CLERK,7902,1980/12/17,800,20
7499,ALLEN,SALESMAN,7698,1981/2/20,1600,300,30
7521,WARD,SALESMAN,7698,1981/2/22,1250,500,30
7566,JONES,MANAGER,7839,1981/4/2,2975,20
7654,MARTIN,SALESMAN,7698,1981/9/28,1250,1400,30
7698,BLAKE,MANAGER,7839,1981/5/1,2850,30
7782,CLARK,MANAGER,7839,1981/6/9,2450,10
7788,SCOTT,ANALYST,7566,1987/4/19,3000,20
7839,KING,PRESIDENT,1981/11/17,5000,10
7844,TURNER,SALESMAN,7698,1981/9/8,1500,0,30
7876,ADAMS,CLERK,7788,1987/5/23,1100,20
7900,JAMES,CLERK,7698,1981/12/3,9500,30
7902,FORD,ANALYST,7566,1981/12/3,3000,20
7934,MILLER,CLERK,7782,1982/1/23,1300,10

二、创建DataFrame

方式一:DSL方式操作

  • 实例化SparkContext和SparkSession对象
  • 利用StructType类型构建schema,用于定义数据的结构信息
  • 通过SparkContext对象读取文件,生成RDD
  • 将RDD[String]转换成RDD[Row]
  • 通过SparkSession对象创建dataframe
  • 完整代码如下:
package com.scala.demo.sql

import org.apache.spark.{SparkConf, SparkContext}
import org.apache.spark.sql.{Row, SparkSession}
import org.apache.spark.sql.types.{DataType, DataTypes, StructField, StructType}

object Demo01 {
  def main(args: Array[String]): Unit = {
    // 1.创建SparkContext和SparkSession对象
    val sc = new SparkContext(new SparkConf().setAppName("Demo01").setMaster("local[2]"))
    val sparkSession = SparkSession.builder().getOrCreate()

    // 2. 使用StructType来定义Schema
    val mySchema = StructType(List(
      StructField("empno", DataTypes.IntegerType, false),
      StructField("ename", DataTypes.StringType, false),
      StructField("job", DataTypes.StringType, false),
      StructField("mgr", DataTypes.StringType, false),
      StructField("hiredate", DataTypes.StringType, false),
      StructField("sal", DataTypes.IntegerType, false),
      StructField("comm", DataTypes.StringType, false),
      StructField("deptno", DataTypes.IntegerType, false)
    ))
    // 3. 读取数据
    val empRDD = sc.textFile("file:///D:\\TestDatas\\emp.csv")

    // 4. 将其映射成ROW对象
    val rowRDD = empRDD.map(line => {
      val strings = line.split(",")
      Row(strings(0).toInt, strings(1), strings(2), strings(3), strings(4), strings(5).toInt,strings(6), strings(7).toInt)
    })

    // 5. 创建DataFrame
    val dataFrame = sparkSession.createDataFrame(rowRDD, mySchema)

    // 6. 展示内容 DSL
	dataFrame.groupBy("deptno").sum("sal").as("result").sort("sum(sal)").show()
  }
}

结果如下:

Spark SQL 2.4.8 操作 Dataframe的两种方式 

方式二:SQL方式操作

  • 实例化SparkContext和SparkSession对象
  • 创建case class Emp样例类,用于定义数据的结构信息
  • 通过SparkContext对象读取文件,生成RDD[String]
  • 将RDD[String]转换成RDD[Emp]
  • 引入spark隐式转换函数(必须引入)
  • 将RDD[Emp]转换成DataFrame
  • 将DataFrame注册成一张视图或者临时表
  • 通过调用SparkSession对象的sql函数,编写sql语句
  • 停止资源
  • 具体代码如下:
package com.scala.demo.sql

import org.apache.spark.rdd.RDD
import org.apache.spark.sql.{Row, SparkSession}
import org.apache.spark.{SparkConf, SparkContext}
import org.apache.spark.sql.types.{DataType, DataTypes, StructField, StructType}

// 0. 数据分析
// 7499,ALLEN,SALESMAN,7698,1981/2/20,1600,300,30
// 1. 定义Emp样例类
case class Emp(empNo:Int,empName:String,job:String,mgr:String,hiredate:String,sal:Int,comm:String,deptNo:Int)

object Demo02 {
  def main(args: Array[String]): Unit = {
    // 2. 读取数据将其映射成Row对象
    val sc = new SparkContext(new SparkConf().setMaster("local[2]").setAppName("Demo02"))
    val mapRdd = sc.textFile("file:///D:\\TestDatas\\emp.csv")
      .map(_.split(","))

    val rowRDD:RDD[Emp] = mapRdd.map(line => Emp(line(0).toInt, line(1), line(2), line(3), line(4), line(5).toInt, line(6), line(7).toInt))

    // 3。创建dataframe
    val spark = SparkSession.builder().getOrCreate()
    // 引入spark隐式转换函数
    import spark.implicits._
    // 将RDD转成Dataframe
    val dataFrame = rowRDD.toDF

    // 4.2 sql语句操作
    // 1、将dataframe注册成一张临时表
    dataFrame.createOrReplaceTempView("emp")
    // 2. 编写sql语句进行操作
    spark.sql("select deptNo,sum(sal) as total from emp group by deptNo order by total desc").show()

    // 关闭资源
    spark.stop()
    sc.stop()
  }
}

结果如下:

Spark SQL 2.4.8 操作 Dataframe的两种方式

到此这篇关于Spark SQL 2.4.8 操作 Dataframe的两种方式的文章就介绍到这了,更多相关Spark SQL 操作 Dataframe内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

SQL Server 相关文章推荐
SqlServer: 如何更改表的文件组?(进而改变存储位置)
Apr 05 SQL Server
SQL Server连接查询的实用教程
Apr 07 SQL Server
SQL 尚未定义空闲 CPU 条件 - OnIdle 作业计划将不起任何作用
Jun 30 SQL Server
sql通过日期判断年龄函数的示例代码
Jul 16 SQL Server
SQL Server数据库基本概念、组成、常用对象与约束
Mar 20 SQL Server
SQL Server内存机制浅探
Apr 06 SQL Server
使用 MybatisPlus 连接 SqlServer 数据库解决 OFFSET 分页问题
Apr 22 SQL Server
SQL Server 中的事务介绍
May 20 SQL Server
SQL Server使用T-SQL语句批处理
May 20 SQL Server
SQL Server一个字符串拆分多行显示或者多行数据合并成一个字符串
May 25 SQL Server
SQL使用复合索引实现数据库查询的优化
May 25 SQL Server
SqlServer常用函数及时间处理小结
May 08 SQL Server
Windows环境下实现批量执行Sql文件
万能密码的SQL注入漏洞其PHP环境搭建及防御手段
Sep 04 #SQL Server
sql server删除前1000行数据的方法实例
Aug 30 #SQL Server
SQLServer之常用函数总结详解
Aug 30 #SQL Server
SQL写法--行行比较
Aug 23 #SQL Server
SQL语句中JOIN的用法场景分析
sql通过日期判断年龄函数的示例代码
Jul 16 #SQL Server
You might like
基础的WordPress插件制作教程
2015/11/24 PHP
[原创]PHP实现字节数Byte转换为KB、MB、GB、TB的方法
2017/08/31 PHP
js获取单元格自定义属性值的代码(IE/Firefox)
2010/04/05 Javascript
拖动table标题实现改变td的大小(css+js代码)
2013/04/16 Javascript
Extjs4 类的定义和扩展实例
2013/06/28 Javascript
js onmousewheel事件多次触发问题解决方法
2014/10/17 Javascript
使用JavaScript获取地址栏参数的方法
2014/12/19 Javascript
js实现仿QQ秀换装效果的方法
2015/03/04 Javascript
JS实现仿苹果底部任务栏菜单效果代码
2015/08/28 Javascript
JavaScript中对DOM节点的访问、创建、修改、删除
2015/11/16 Javascript
基于jQuery实现简单的折叠菜单效果
2015/11/23 Javascript
基于jQuery的网页影音播放器jPlayer的基本使用教程
2016/03/08 Javascript
前端性能优化及技巧
2016/05/06 Javascript
Nodejs 搭建简单的Web服务器详解及实例
2016/11/30 NodeJs
JS数组排序方法实例分析
2016/12/16 Javascript
vue-cli+webpack记事本项目创建
2017/04/01 Javascript
JavaScript之filter_动力节点Java学院整理
2017/06/28 Javascript
使用Nuxt.js改造已有项目的方法
2018/08/07 Javascript
nodejs中的异步编程知识点详解
2021/01/17 NodeJs
Python使用MD5加密字符串示例
2014/08/22 Python
详解Python迭代和迭代器
2016/03/28 Python
Python实现的多项式拟合功能示例【基于matplotlib】
2018/05/15 Python
python实现电脑自动关机
2018/06/20 Python
PyCharm+Qt Designer+PyUIC安装配置教程详解
2019/06/13 Python
Django之使用内置函数和celery发邮件的方法示例
2019/09/16 Python
python性能测量工具cProfile使用解析
2019/09/26 Python
python unichr函数知识点总结
2020/12/16 Python
CSS3实现全景图特效示例代码
2018/03/26 HTML / CSS
怎样实现H5+CSS3手指滑动切换图片的示例代码
2019/05/05 HTML / CSS
李宁官方网店:中国运动品牌
2017/11/02 全球购物
军训自我鉴定
2013/12/14 职场文书
团队精神口号
2014/06/06 职场文书
2014乡镇领导班子四风对照检查材料思想汇报
2014/10/05 职场文书
无罪辩护词范文
2015/05/21 职场文书
小学教师暑期培训心得体会
2016/01/09 职场文书
在CSS中映射鼠标位置并实现通过鼠标移动控制页面元素效果(实例代码)
2021/04/22 HTML / CSS