目录

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. python3调用js的库之execjs

    执行JS的类库:execjs,PyV8,selenium,node execjs是一个比较好用且容易上手的类库(支持py2,与py3),支持 JS runtime. 1.安装: pip install ...

  2. C++智能指针使用说明

    导读 STL提供四种智能指针:auto_ptr.unique_ptr.shared_ptr和weak_ptr.其中auto_ptr是C++98提供的解决方案,C++11以后均已摒弃.所有代码在gcc ...

  3. 「Celeste-B」Say Goodbye

    做法一 提供一个后半部分略微不同的做法. 首先,基环旋转同构肯定是用 Burnside 那套理论求不动点来解,设 \(f(n, m)\) 为每种颜色 \(/m\) 构成 \(n\) 棵(树之间有标号) ...

  4. 封装jar问题java.lang.SecurityException: Invalid signature file digest for Manifest main attributes以及maven依赖重提解决

    1.jar包封装完成后,其他项目引用jar,启动时报错java.lang.SecurityException: Invalid signature file digest for Manifest m ...

  5. 【Android珍藏】推荐10个炫酷的开源库【转】

    感谢大佬:https://www.jianshu.com/p/d608f0228fd4 前言 技术群里面经常有人问到一些炫酷的UI效果实现方法,有时候我都是给一个相同或者相似效果的Github链接,有 ...

  6. android 如何动态设置View的margin和padding

    感谢大佬:https://blog.csdn.net/a107494639/article/details/7341077 1.动态设置padding,拿ImageView为例: ImageView ...

  7. 常见消息处理api

    面试:子线程一定不能更新UI? SurfaceView :多媒体视频播放 ,可以在子线程中更新UI: Progress(进度)相关的控件:也是可以在子线程中更新Ui;审计机制:activity完全显示 ...

  8. 关于final关键字

    final修饰基本数据类型时 修饰的变量值不可变 final修饰引用数据类型时 修饰的变量地址不可变 值可变 final修饰一个类中的方法时 不可被子类重写 final修饰一个类时 不可被其他类继承 ...

  9. Python—高级函数

    Python-高级函数 一.闭包 Python函数是支持嵌套的.如果在一个内部函数中对外部函数作用域(非全局作用域)的变量进行引用,那么内部函数就会被称为闭包.闭包需要满足如下3个条件: 存在于两个嵌 ...

  10. MySQL中 BETWEEN ... AND ...

    MySQL中 BETWEEN ... AND ... 1. 准备测试数据 CREATE TABLE `student` ( `id` int(11) NOT NULL AUTO_INCREMENT, ...