目录

1

import org.apache.spark.sql.{DataFrame, SaveMode, SparkSession}

object Demo1Sess {
def main(args: Array[String]): Unit = { val spark: SparkSession = SparkSession.builder()
.master("local")
.appName("Demo1Sess")
// 设置spark sql产生shuffle后默认的分区数 => 并行度
// 默认是 200
.config("spark.sql.shuffle.partitions",3)
.getOrCreate() // 从SparkSession获取SparkContext
// val sc: SparkContext = spark.sparkContext // json中每条数据都自带结构 可以直接转换成DF
val stuDF: DataFrame = spark
.read
.format("json")
.load("spark/data/students.json") stuDF.show() //默认显示20条 // 文本类的数据 默认是没有列名的 直接读进来是 _c0 _c1 _c2 ......
// 可以通过schema手动指定列名,空格隔开字段和字段类型
val stucsDF: DataFrame = spark
.read
.format("csv")
.schema("id String,name String,age Int,gender String,clazz String")
.load("scala/data/students.txt") stucsDF.show() // 直接将DataFrame注册成临时视图view
stucsDF.createOrReplaceTempView("stu") // sql的方式
val ageDF: DataFrame = spark.sql("select * from stu where age=22")
ageDF.show() // 同rdd一样,操作算子可以触发job // DSL 类SQL的方式 介于SQL和代码中间的API val dslDF: DataFrame = stucsDF.where("age=23")
.select("name", "age", "clazz")
dslDF.show() // 统计班级人数
stucsDF.groupBy("clazz")
.count()
.write
.mode(SaveMode.Overwrite)
.save("spark/data/clazz_cnt") // 保存的时候可以指定SaveMode
// Overwrite 覆盖
// Append 追加
// 默认以parquet形式保存 } }

2

import Practice.Student
import org.apache.spark.rdd.RDD
import org.apache.spark.sql.{DataFrame, Row, SaveMode, SparkSession} object Demo2CreateDF {
def main(args: Array[String]): Unit = { val spark: SparkSession = SparkSession.builder()
.master("local")
.appName("Demo2CreateDF")
.config("spark.sql.shuffle.partitions", 3)
.getOrCreate() /**
* 1、读json数据
*/ val jsonDF: DataFrame = spark.read
.format("json")
.load("spark/data/students.json") // jsonDF.show() // 默认显示20条
// jsonDF.show(100) // 显示100条
// jsonDF.show(false) // 完全显示
// jsonDF.show() /**
* 2、读文本文件
*/ val csvDF: DataFrame = spark.read
.format("csv")
//csv 格式读取默认是以逗号分隔
.option("sep", ",")
.schema("id String,name String,age Int,gender String,clazz String")
.load("scala/data/students.txt") // csvDF.show() /**
* 3、JDBC 读取MySQL的一张表转换成 Spark SQL中的DF
*/ val jdbcDF: DataFrame = spark.read
.format("jdbc")
.option("url", "jdbc:mysql://master:3306/student")
.option("dbtable", "student")
.option("user", "root")
.option("password", "123456")
.load() // jdbcDF.show() // 将数据以parquet格式保存
// jdbcDF
// .write
// .mode(SaveMode.Overwrite)
// .parquet("spark/data/stu_parquet") /**
* 4、读取parquet文件
* 无法直接查看,默认会进行压缩,而且自带表结构,读取时不需要指定schema
* 默认使用snappy压缩方式进行压缩
*/ spark.read
.format("parquet")
.load("spark/data/stu_parquet")
// .show() // 将数据以orc格式保存
// jdbcDF.write.orc("spark/data/stu_orc") /**
* 5、读取ORC格式的文件
* 也会默认进行压缩,空间占用率最小,默认带有表结构,可以直接读取
*/ // spark
// .read
// .format("orc")
// .load("spark/data/stu_orc") /**
* 6、从RDD构建DF
*/ val stuRDD: RDD[String] = spark.sparkContext.textFile("scala/data/students.txt")
val stuRDD2: RDD[Student] = stuRDD.map(line => {
val splits: Array[String] = line.split(",")
val id: String = splits(0)
val name: String = splits(1)
val age: String = splits(2)
val gender: String = splits(3)
val clazz: String = splits(4)
Student(id, name, age, gender, clazz)
}) // 导入隐式转换
import spark.implicits._
val sDF: DataFrame = stuRDD2.toDF()
sDF.show() // DataFrame to RDD
val rdd: RDD[Row] = sDF.rdd
rdd.foreach(row=>{
val id: String = row.getAs[String]("id")
val name: String = row.getAs[String]("name")
println(s"$id,$name")
}) } case class Student(id:String,name:String,age: String, gender: String, clazz: String) }

3

import org.apache.spark.sql.{DataFrame, SparkSession}

object DFapi {
def main(args: Array[String]): Unit = {
val spark: SparkSession = SparkSession.builder()
.master("local")
.appName("DFapi")
.config("spark.sql.shuffle.partitions", 2)
.getOrCreate() import spark.implicits._ val stuDF: DataFrame = spark.read
.format("csv")
.option("sep", ",")
.schema("id String,name String,age String,gender String,clazz String")
.load("scala/data/students.txt") // 对多次使用的DF也可进行cache
stuDF.cache() // 过滤 where
// 过滤出 年龄 大于 23的学生
// DSL // 字符串表达式
stuDF.where("age>23") // 列表达式 (推荐),需要先导入隐式转换
stuDF.where($"age" > 23) // 使用filter加函数的方式进行过滤
stuDF.filter(row => {
val age: String = row.getAs[String]("age")
if (age.toInt > 23) {
true
}
else {
false
}
}) // select
stuDF.select($"id", $"name", $"age" + 100 as "newage") // 分组 groupBy
// 聚合
// 统计班级人数
stuDF.groupBy($"clazz")
.count().show() // 导入所有的sql函数
import org.apache.spark.sql.functions._
// 统计每个班的性别人数
stuDF.groupBy($"clazz", $"gender")
.agg(count($"gender"))
.show() // 统计班级人数(数据可能有重复)
stuDF.groupBy($"clazz")
.agg(countDistinct($"id") as "去重人数")
.show() // SQL 的方式
stuDF.createOrReplaceTempView("stu")
spark.sql(
"""
|select clazz,count(distinct id)
|from stu
|group by clazz
""".stripMargin
).show() // join
val scoreDF: DataFrame = spark.read
.format("csv")
.schema("sid String,sub_id String,score Int")
.load("scala/data/score.txt") // 当两张表的关联字段名字一样时
// 在这里直接指定 "id" 默认是inner join
// .join(scoreDF, "id")
// 可以将 "id" 放入 List 传入 再指定关联类型
// .join(scoreDF, List("id"), "left")
// 如果 关联字段不一样
stuDF.join(scoreDF,$"id"===$"sid","left").show() stuDF.unpersist() } }

4

import org.apache.spark.sql.{DataFrame, SparkSession}

object DianXin {
def main(args: Array[String]): Unit = {
val spark: SparkSession = SparkSession.builder()
.master("local")
.appName("DianXin")
.config("spark.sql.shuffle.partitions", 2)
.getOrCreate() val dxDF: DataFrame = spark.read
.format("csv")
.option("sep", ",")
.schema("mdn String,grid_id String,city_id String,county_id String,t String,start_time String,end_time String,date String")
.load("spark/data/dianxin_data") // 导入隐式转换
import spark.implicits._
// 导入Spark SQL中所有的函数
import org.apache.spark.sql.functions._ // 按城市统计每个区县的游客人数top3
dxDF.createOrReplaceTempView("dx") spark.sql(
"""
|select tt1.city_id,tt1.county_id,tt1.sum,tt1.rk
|from
|(select t1. city_id,t1.county_id,t1.sum,row_number() over (partition by county_id order by t1.sum desc) as rk
|from
|(select city_id,county_id,count(distinct mdn) as sum
|from
|dx
|group by city_id,county_id) t1) tt1
|where tt1.rk<3
|
""".stripMargin
).show() }
}

Spark SQL和CSl的更多相关文章

  1. Spark SQL 之 Data Sources

    #Spark SQL 之 Data Sources 转载请注明出处:http://www.cnblogs.com/BYRans/ 数据源(Data Source) Spark SQL的DataFram ...

  2. Spark SQL 之 DataFrame

    Spark SQL 之 DataFrame 转载请注明出处:http://www.cnblogs.com/BYRans/ 概述(Overview) Spark SQL是Spark的一个组件,用于结构化 ...

  3. 【原】Learning Spark (Python版) 学习笔记(三)----工作原理、调优与Spark SQL

    周末的任务是更新Learning Spark系列第三篇,以为自己写不完了,但为了改正拖延症,还是得完成给自己定的任务啊 = =.这三章主要讲Spark的运行过程(本地+集群),性能调优以及Spark ...

  4. Spark 官方文档(5)——Spark SQL,DataFrames和Datasets 指南

    Spark版本:1.6.2 概览 Spark SQL用于处理结构化数据,与Spark RDD API不同,它提供更多关于数据结构信息和计算任务运行信息的接口,Spark SQL内部使用这些额外的信息完 ...

  5. Spark SQL Example

     Spark SQL Example This example demonstrates how to use sqlContext.sql to create and load a table ...

  6. 通过Spark SQL关联查询两个HDFS上的文件操作

    order_created.txt   订单编号  订单创建时间 -- :: -- :: -- :: -- :: -- :: order_picked.txt   订单编号  订单提取时间 -- :: ...

  7. Spark SQL 之 Migration Guide

    Spark SQL 之 Migration Guide 支持的Hive功能 转载请注明出处:http://www.cnblogs.com/BYRans/ Migration Guide 与Hive的兼 ...

  8. Spark SQL 官方文档-中文翻译

    Spark SQL 官方文档-中文翻译 Spark版本:Spark 1.5.2 转载请注明出处:http://www.cnblogs.com/BYRans/ 1 概述(Overview) 2 Data ...

  9. Spark SQL 之 Performance Tuning & Distributed SQL Engine

    Spark SQL 之 Performance Tuning & Distributed SQL Engine 转载请注明出处:http://www.cnblogs.com/BYRans/ 缓 ...

随机推荐

  1. springboot实战小项目-简要介绍、vue项目创建

    因为菜,所以要好好学习! 一.项目介绍:这是一个后台管理系统,准备实现的功能: 1.登录.注册.个人信息查看.退出登录 2.根据关键字查询用户.新增用户.根据id或者其他字段排序.编辑用户信息.删除用 ...

  2. springboot实现分布式锁(spring integration,redis)

    Springboot实现分布式锁(Spring Integration+Redis) 一.在项目的pom.xml中添加相关依赖 1)Spring Integration依赖 <dependenc ...

  3. 直接引入vue.js和使用vue脚手架的区别?

    脚手架工具搭建的项目是把Vue作为一个模块(如CommonJS规范的模块)对待,在源码中引入vue模块,最终需要用构建工具(如webpack)载入模块,编写代码需要require('vue'). 而直 ...

  4. [源码解析] 模型并行分布式训练Megatron (5) --Pipedream Flush

    [源码解析] 模型并行分布式训练Megatron (5) --Pipedream Flush 目录 [源码解析] 模型并行分布式训练Megatron (5) --Pipedream Flush 0x0 ...

  5. 神奇小证明之——世界上只有5个正多面体+构造x3=2a3

    今天我彻底放飞自我了...作业还没写完...但就是要总结一些好玩的小性质...谁给我的勇气呢?

  6. Note/Solution - 转置原理 & 多点求值

    \[\newcommand{\vct}[1]{\boldsymbol{#1}} \newcommand{\mat}[1]{\begin{bmatrix}#1\end{bmatrix}} \newcom ...

  7. Solution -「NOI 模拟赛」出题人

    \(\mathcal{Description}\)   给定 \(\{a_n\}\),求一个 \(\{b_{n-1}\}\),使得 \(\forall x\in\{a_n\},\exists i,j\ ...

  8. Solution -「CF 510E」Fox And Dinner

    \(\mathcal{Description}\)   Link.   给定正整数集合 \(\{a_n\}\),求一种把这些数放置在任意多个圆环上的方案,使得每个环的大小大于 \(2\) 且环上相邻两 ...

  9. suse 12 编译部署 Nginx

    文章目录 编译前准备 创建nginx用户 下载nginx源码包 安装编译环境依赖 编译nginx 配置nginx为systemctl管理 Linux:~ # cat /etc/os-release N ...

  10. suse 12 sp3 利用shell脚本离线编译安装ansible

    # 测试环境是suse 12 sp3的系统,机器都是内网使用的,安装ansible真的很难顶 # 测试环境使用的python版本:2.7.13-27 # 此脚本只在本人测试环境成功,其他环境,需要选择 ...