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. vue学习(十七) 使用自定义指令 使文本框获得鼠标焦点

    需求:当我们进入某个页面,页面中的第一个input会自动获得焦点 光标闪烁,代表可输入 <div id="app"> //v-focus 是自定义的 <input ...

  2. Java方法(函数)

    4.1方法简介 方法是语句的集合,他们在一起执行一个功能: 1.方法是解决一类问题的步骤的有序组合(功能块) 2.方法包含于类与对象中 3.方法在程序中创建,在其它地方引用 4.原子性:单一职能原则( ...

  3. java基础(七)--键盘输入

    一.示例 package cnblogs; import java.util.Scanner; public class TestBase07IO { public static void main( ...

  4. Raid0,1,5,10,50

    raid0 就是把多个硬盘合并成1个逻辑盘使用,数据读写时对各硬盘同时操作,不同硬盘写入不同数据,速度快. **最少需要2块硬盘 raid1 同时对2个硬盘读写(同样的数据).强调数据的安全性.损坏一 ...

  5. Lua学习入门(基本数据类型)

    数据类型 Lua 中有 8 个基本类型分别为:nil.boolean.number.string.userdata.function.thread 和 table. 数据类型 描述 nil 这个最简单 ...

  6. 一分钟玩转 Spring IoC

    前言 「上一篇文章」我们对 Spring 有了初步的认识,而 Spring 全家桶中几乎所有组件都是依赖于 IoC 的. 刚开始听到 IoC,会觉得特别高大上,但其实掰开了很简单. 跟着我的脚步,一文 ...

  7. Python os.fstatvfs() 方法

    概述 os.fstatvfs() 方法用于返回包含文件描述符fd的文件的文件系统的信息,类似 statvfs().高佣联盟 www.cgewang.com Unix上可用. fstatvfs 方法返回 ...

  8. PHP preg_grep() 函数

    preg_grep 函数用于返回匹配模式的数组条目.高佣联盟 www.cgewang.com 语法 array preg_grep ( string $pattern , array $input [ ...

  9. 二维线段树->树套树

    现在上真正的二维线段树 毕竟 刚刚那个是卡常 过题我们现在做一个更高级的做法二维线段树. 大体上维护一颗x轴线段树 然后在每个节点的下方再吊一颗维护y轴的线段树那么此时我们整个平面就被我们玩好了. 这 ...

  10. loj #6039 「雅礼集训 2017 Day5」珠宝 分组背包 决策单调性优化

    LINK:珠宝 去年在某个oj上写过这道题 当时懵懂无知wa的不省人事 终于发现这个东西原来是有决策单调性的. 可以发现是一个01背包 但是过不了 冷静分析 01背包的复杂度有下界 如果过不了说明必然 ...