import org.apache.spark.sql.SQLContext
import org.apache.spark.sql.expressions.Window
import org.apache.spark.sql.hive.HiveContext
import org.apache.spark.{SparkConf, SparkContext}

case class Person2(name: String, age: Int, sex: String, salary: Int, deptNo: Int)

case class Dept(deptNo: Int, deptName: String)

object SparkSQLDSLDemo {
def main(args: Array[String]): Unit = {
// 1. 上下文创建
val conf = new SparkConf()
.setAppName("demo")
.setMaster("local[*]")
val sc = SparkContext.getOrCreate(conf)
// 当使用HiveContext的时候需要给定jvm的参数:-XX:PermSize=128M -XX:MaxPermSize=256M
val sqlContext = new HiveContext(sc)
import sqlContext.implicits._
import org.apache.spark.sql.functions._

sqlContext.udf.register("sexToNum", (sex: String) => {
sex.toUpperCase match {
case "M" => 0
case "F" => 1
case _ => -1
}
})
sqlContext.udf.register("self_avg", SelfAvgUDAF)

// 2. 直接创建模拟数据
val rdd1 = sc.parallelize(Array(
Person2("张三", 21, "M", 1235, 1),
Person2("李四", 20, "F", 1235, 1),
Person2("王五", 26, "M", 1235, 1),
Person2("小明", 25, "F", 1225, 1),
Person2("小花", 24, "F", 1425, 1),
Person2("小华", 23, "M", 1215, 1),
Person2("gerry", 22, "F", 1415, 2),
Person2("tom", 21, "F", 1855, 2),
Person2("lili", 20, "F", 1455, 2),
Person2("莉莉", 18, "M", 1635, 2)
))
val rdd2 = sc.parallelize(Array(
Dept(1, "部门1"),
Dept(2, "部门2")
))

val personDataFrame = rdd1.toDF()
val deptDataFrame = rdd2.toDF()

// ====DSL==================================
// cache 多次使用的DataFrame
personDataFrame.cache()
deptDataFrame.cache()

// select语法
println("----select-----")
personDataFrame.select("name", "age", "sex").show()
personDataFrame.select($"name", $"age", $"sex".as("sex1")).show()
personDataFrame.select(col("name").as("name1"), col("age").as("age1"), col("sex")).show()
personDataFrame.selectExpr("name", "age", "sex", "sexToNum(sex) as sex_num").show()

// where/filter
println("------where/filter-------")
personDataFrame.where("age > 22").where("sex = 'M'").where("deptNo = 1").show()
personDataFrame.where("age > 20 AND sex='M' AND deptNo = 1").show()
personDataFrame.where($"age" > 20 && $"sex" === "M" && $"deptNo" === 1).show()
personDataFrame.where($"age" > 20 && $"deptNo" === 1 && ($"sex" !== "F")).show()

// sort
println("-----------sort--------------")
// 全局排序
personDataFrame.sort("salary").select("name", "salary").show()
personDataFrame.sort($"salary".desc).select("name", "salary", "age").show()
personDataFrame.sort($"salary".desc, $"age".asc).select("name", "salary", "age").show()
personDataFrame.orderBy($"salary".desc, $"age".asc).select("name", "salary", "age").show()
personDataFrame
.repartition(5)
.orderBy($"salary".desc, $"age")
.select("name", "salary", "age").show()
// 局部排序(按照分区进行排序)
personDataFrame
.repartition(5)
.sortWithinPartitions($"salary".desc, $"age".asc)
.select("name", "salary", "age")
.show()

// group by
personDataFrame
.groupBy("sex")
.agg(
"salary" -> "avg",
"salary" -> "sum"
)
.show()
personDataFrame
.groupBy("sex")
.agg(
avg("salary").as("avg_salary"),
min("salary").as("min_salary"),
count(lit(1)).as("cnt")
)
.show()
personDataFrame
.groupBy("sex")
.agg(
"salary" -> "self_avg"
)
.show()

// limit
personDataFrame.limit(2).show()

// ==join===============
println("----------join--------------------")
personDataFrame.join(deptDataFrame).show()
// 无法判断deptNo属于哪个DataFrame的会报错
// personDataFrame.join(deptDataFrame, $"deptNo" === $"deptNo")
personDataFrame.join(deptDataFrame.toDF("col1", "deptName"), $"deptNo" === $"col1", "inner").show()
personDataFrame.join(deptDataFrame, "deptNo").show()
personDataFrame
.join(deptDataFrame.toDF("deptNo", "name"), Seq("deptNo"), "left_outer")
.toDF("no", "name", "age", "sex", "sal", "dname")
.show()

// ===窗口分析函数=======必须要是是使用HiveContext对象
/** *
* 按照deptNo分组,组内按照salary进行排序,获取每个部门前3个销售额的用户信息
* select *
* from
* (select *, ROW_NUMBER() OVER (Partition by deptNo Order by salary desc) as rnk
* from person) as tmp
* where tmp.rnk <= 3
*/
val w = Window.partitionBy("deptNo").orderBy($"salary".desc, $"age".asc)
personDataFrame
.select(
$"name", $"age", $"deptNo", $"salary",
row_number().over(w).as("rnk")
)
.where("rnk <= 3")
.show()

// 清除缓存
personDataFrame.unpersist()
personDataFrame.unpersist()
}
}
————————————————
版权声明:本文为CSDN博主「weixin_40652340」的原创文章,遵循CC 4.0 by-sa版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_40652340/article/details/79207455

SparkSQL DSL开发(Old)的更多相关文章

  1. 手把手教你 在IDEA搭建 SparkSQL的开发环境

    1. 创建maven项目 在IDEA中添加scala插件 并添加scala的sdk https://www.cnblogs.com/bajiaotai/p/15381309.html 2. 相关依赖j ...

  2. SparkSQL DSL 随便写写

    @Testdef functionTest() = { Logger.getLogger("org").setLevel(Level.WARN) val spark = getSp ...

  3. 简述 Ruby 与 DSL 在 iOS 开发中的运用

    阅读本文不需要预先掌握 Ruby 与 DSL 相关的知识 何为 DSL DSL(Domain Specific Language) 翻译成中文就是:"领域特定语言".首先,从定义就 ...

  4. 在Visual Studio 2010中使用DSL Tool特定领域开发 开篇

    本来是很想写关于VS的DSL的文章的,有点小忙,就一直在拖延,忽然有看见了"<在Visual Studio 2012中使用VMSDK开发特定领域语言>",又有写的欲望了 ...

  5. 白话 Ruby 与 DSL 以及在 iOS 开发中的运用

    每日一篇优秀博文 2017年10月7日 周六 白话 Ruby 与 DSL 以及在 iOS 开发中的运用 阅读本文不需要预先掌握 Ruby 与 DSL 相关的知识 何为 DSL DSL(Domain S ...

  6. 在Visual Studio 2012中使用VMSDK开发领域特定语言(二)

    本文为<在Visual Studio 2012中使用VMSDK开发领域特定语言>专题文章的第二部分,在这部分内容中,将以实际应用为例,介绍开发DSL的主要步骤,包括设计.定制.调试.发布以 ...

  7. 在Visual Studio 2012中使用VMSDK开发领域特定语言(一)

    前言 本专题主要介绍在Visual Studio 2012中使用Visualization & Modeling SDK进行领域特定语言(DSL)的开发,包括两个部分的内容.在第一部分中,将对 ...

  8. 在Visual Studio 2012中使用VMSDK开发领域特定语言1

    在Visual Studio 2012中使用VMSDK开发领域特定语言(一)   前言 本专题主要介绍在Visual Studio 2012中使用Visualization & Modelin ...

  9. Spring Webflux: Kotlin DSL [片断]

    原文链接:https://dzone.com/articles/spring-webflux-kotlin-dsl-snippets 作者:Biju Kunjummen 译者:Jackie Tang ...

随机推荐

  1. Shell变量的作用域:Shell全局变量、环境变量和局部变量

    Shell 变量的作用域(Scope),就是 Shell 变量的有效范围(可以使用的范围). 在不同的作用域中,同名的变量不会相互干涉,就好像 A 班有个叫小明的同学,B 班也有个叫小明的同学,虽然他 ...

  2. Salt组件之管理对象Target

    管理对象 Target 在Master上我们可以采用不同Target去管理不同的Minion.这些Target都是通过去管理和匹配Minion的ID来做的一些集合. 1.正则匹配,参数-E,你可以写任 ...

  3. 做完这套面试题,你才敢说懂Excel

    下面的题目来自一份商品专员的面试题,其中有涉及到条件格式.自定义排序.数据验证制作下拉菜单.查找引用类函数.文本提取函数等等技能. 满满的干货技能可不是商品专员“专属”,如果你能熟练掌握,在平日工作中 ...

  4. PHP date_sub() 函数

    ------------恢复内容开始------------ 实例 从 2013 年 3 月 15 日减去 40 天: <?php$date=date_create("2013-03- ...

  5. day13. 迭代器与高阶函数

    一.迭代器 """ 能被next调用,并不断返回下一个值的对象,叫做迭代器(对象) 概念: 迭代器指的是迭代取值的工具,迭代是一个重复的过程,每次重复都是基于上一次的结果 ...

  6. Spring Validation最佳实践及其实现原理,参数校验没那么简单!

    之前也写过一篇关于Spring Validation使用的文章,不过自我感觉还是浮于表面,本次打算彻底搞懂Spring Validation.本文会详细介绍Spring Validation各种场景下 ...

  7. Git科普文,Git基本原理&各种骚操作

    Git简单介绍 Git是一个分布式版本控制软件,最初由Linus Torvalds创作,于2005年以GPL发布.最初目的是为更好地管理Linux内核开发而设计. Git工作流程以及各个区域 Work ...

  8. 久等了,你要的 Python 书籍推荐,来了

    前言 很多人学习python,不知道从何学起.很多人学习python,掌握了基本语法过后,不知道在哪里寻找案例上手.很多已经做案例的人,却不知道如何去学习更加高深的知识.那么针对这三类人,我给大家提供 ...

  9. Python实现各类验证码识别

    项目地址: https://github.com/kerlomz/captcha_trainer 编译版下载地址: https://github.com/kerlomz/captcha_trainer ...

  10. 搭建MyBatis开发环境及基本的CURD

    目录 一.MyBatis概述 1. MyBatis 解决的主要问题 二.快速开始一个 MyBatis 1. 创建mysql数据库和表 2. 创建maven工程 3. 在pom.xml文件中添加信息 4 ...