基于API和SQL的基本操作【DataFrame】
写在前面:
当得到一个DataFrame对象之后,可以使用对象提供的各种API方法进行直接调用,进行数据的处理。
// =====基于dataframe的API=======之后的就都是DataFrame 的操作了==============
infoDF.show()
infoDF.filter(infoDF.col("age") > 30).show()
另,也可以将DataFrame对象通过createOrReplaceTempView()方法,将其转为一张表,从而使用SQL来进行数据处理。
// ======基于SQL的API===========DataFrame 创建为一张表================
infoDF.createOrReplaceTempView("infos")
spark.sql("select * from infos where age > 30").show()
主要介绍一下API的基本操作,因为SQL的话,写法和传统的基本没差。
DEMO1
package february.sql
import org.apache.spark.sql.SparkSession
/**
* Description: DataFrame API基本操作 直接读取Json文件为DataFrame对象
*
* @Author: 留歌36
* @Date: 2019/2/24 17:54
*/
object DataFrameApp {
def main(args: Array[String]): Unit = {
// Spark SQL的入口点是:SparkSession
val spark = SparkSession.builder()
.appName(this.getClass.getSimpleName)
.master("local[2]")
.getOrCreate()
// 将json文件加载成一个DataFrame
val DF = spark.read.format("json").load("f:\\user.json")
// 输出dataframe对应的schema的信息
DF.printSchema()
// 输出数据集的前20条数据
DF.show()
// 查询某几列所有的数据:select name from table
DF.select("name").show()
// 查询某几列的所有数据,并对列进行计算:select name, age+10 from table;
DF.select(DF.col("name"), (DF.col("age")+10).as("age2")).show()
// 根据某一列的值,进行过滤。select * from table where age > 21
DF.filter(DF.col("age") > 21).show()
// 根据某一列进行分组,然后再进行聚合 select age,count(1) from table group by age
DF.groupBy("age").count().show()
spark.stop()
}
}
DEMO2
package february.sql
import february.sql.DataFrameRDDApp.Info
import org.apache.spark.sql.SparkSession
/**
* Description: DataFrame中的其他操作 读取TXT文件为RDD,再反射隐式转换为DataFrame对象
*
* @Author: 留歌36
* @Date: 2019/2/25 19:31
*/
object DataFrameCase {
def main(args: Array[String]): Unit = {
val spark = SparkSession.builder().appName(this.getClass.getSimpleName).master("local[2]").getOrCreate()
// RDD => DataFrame
val textFile = spark.sparkContext.textFile("f:\\users.txt")
textFile.foreach(println)
// 注意这里的隐私转换,split("\\|") 竖线需要转义
import spark.implicits._
val DF = textFile.map(_.split("\\|")).map(line => Student(line(0).toInt, line(1), line(2), line(3))).toDF()
DF.show()
// show 方法默认只显示前20条记录,show()在这里被重载了很多次
DF.show(30)
DF.show(30,false) //不隐藏其余的
// 返回前10条记录
DF.take(10).foreach(println)
DF.first()
DF.head(5)
DF.select("name","phone").show(30,false)
//name字段为空或NULL的过滤出来
DF.filter("name='' OR name='NULL'").show()
// name 以M开头的
DF.filter("SUBSTR(name,0,1)='留'").show()
// 排序的使用,几种传递参数的方式
DF.sort(DF.col("name").desc).show() //降序
DF.sort(DF("name")).show()
DF.sort("name").show()
// 排序升级操作
DF.sort("name", "id").show()
DF.sort(DF("name").asc, DF("id").desc).show() //name的升序,id的降序
// 修改查询的列名(别名的使用)
DF.select(DF("name").as("stuent_name")).show()
// join 操作
val DF2 = textFile.map(_.split("\\|")).map(line => Student(line(0).toInt, line(1), line(2), line(3))).toDF()
// 默认内连接
val joinDF = DF.join(DF2, DF("id") === DF2("id"))
joinDF.show()
//查看所有的内置函数
// spark.sql("show functions").show(1000)
spark.stop()
}
case class Student(id: Int, name: String, phone: String,email: String)
}
更多相关小demo:每天一个程序:https://blog.csdn.net/liuge36/column/info/34094
基于API和SQL的基本操作【DataFrame】的更多相关文章
- 且谈 Apache Spark 的 API 三剑客:RDD、DataFrame 和 Dataset
作者:Jules S. Damji 译者:足下 本文翻译自 A Tale of Three Apache Spark APIs: RDDs, DataFrames, and Datasets ,翻译已 ...
- MySQL(一) -- MySQL学习路线、数据库的基础、关系型数据库、关键字说明、SQL、MySQL数据库、MySQL服务器对象、SQL的基本操作、库操作、表操作、数据操作、中文数据问题、 校对集问题、web乱码问题
1 MySQL学习路线 基础阶段:MySQL数据库的基本操作(增删改查),以及一些高级操作(视图.触发器.函数.存储过程等). 优化阶段:如何提高数据库的效率,如索引,分表等. 部署阶段:如何搭建真实 ...
- 基于Oracle的SQL优化(社区万众期待 数据库优化扛鼎巨著)
基于Oracle的SQL优化(社区万众期待数据库优化扛鼎巨著) 崔华 编 ISBN 978-7-121-21758-6 2014年1月出版 定价:128.00元 856页 16开 编辑推荐 本土O ...
- 基于iSCSI的SQL Server 2012群集测试(四)--模拟群集故障转移
6.模拟群集故障转移 6.1 模拟手动故障转移(1+1) 模拟手动故障转移的目的有以下几点: 测试群集是否能正常故障转移 测试修改端口是否能同步到备节点 测试禁用full-text和Browser服务 ...
- 数据库 基于索引的SQL语句优化之降龙十八掌(转)
一篇挺不错的关于SQL语句优化的文章,因不知原始出处,故未作引用说明! 1 前言 客服业务受到SQL语句的影响非常大,在规模比较大的局点,往往因为一个小的SQL语句不够优化,导致数据库性能急 ...
- 基于oracle的sql优化
[基于oracle的sql优化] 基于oracle的sql优化 [博主]高瑞林 [博客地址]http://www.cnblogs.com/grl214 一.编写初衷描述 在应有系统开发初期,由于数据库 ...
- 转://从一条巨慢SQL看基于Oracle的SQL优化
http://mp.weixin.qq.com/s/DkIPwbDKIjH2FMN13GkT4w 本次分享的内容是基于Oracle的SQL优化,以一条巨慢的SQL为例,从快速解读SQL执行计划.如何从 ...
- 2019年5月1日起安卓应用应基于API 26开发,那么API等级是啥?
2019年5月1日起安卓应用应基于API 26开发,那么API等级是啥? 转 https://www.ithome.com/html/android/372234.htm 据泰尔终端实验室公众微信 ...
- 基于时间的 SQL注入研究
SQL注入攻击是业界一种非常流行的攻击方式,是由rfp在1998年<Phrack>杂志第54期上的“NT Web Technology Vulnerabilities”文章中首次提出的.时 ...
随机推荐
- Python笔记_类
1.类 1.1 类的定义 # 类的定义 class 类名: pass # pass是空语句,不具有任何意义,仅为了保持程序结构完整性 # 创建对象 对象名 = 类名() 1.2 成员变量 # 成员变量 ...
- 学测试,看视频?NONONO,除非这种情况
001 前言 : 很久没周末写文章了,一个是要睡懒觉.另外一个是,周末写了大家也没有心思看(加班1周了,好不容易周末,你又让我学习 ?先睡个懒觉再说,去TM的学习). 然而,今天早早的5点就起床了,处 ...
- C函数指针状态机实现
C函数指针状态机实现 有限状态机(finite state machine)简称FSM,表示有限个状态及在这些状态之间的转移和动作等行为的数学模型,在计算机领域有着广泛的应用.FSM是一种逻辑单元内部 ...
- Django 项目创建到启动(最全最详细的第一个项目)
一.前言 (一).概述 Python下有许多款不同的 Web 框架.Django是重量级选手中最有代表性的一位.许多成功的网站和APP都基于Django. Django是一个开放源代码的Web应用框架 ...
- Gym 100956 A Random Points on the Circle
二分答案. 对于每次二分后的答案来说, 先倍增序列,通过 two point 来找到 以每个点为起点的最优的符合答案的在哪里. 然后可以DFS树去判断他的前k祖先之间的距离是不是大于k. 常数有点大. ...
- 牛客小白月赛6 E 对弈 思维
链接:https://www.nowcoder.com/acm/contest/136/E来源:牛客网 题目描述 善弈者谋势,不善弈者谋子. ...
- 牛客网暑期ACM多校训练营(第二场) I Car 思维
链接:https://www.nowcoder.com/acm/contest/140/I来源:牛客网 White Cloud has a square of n*n from (1,1) to (n ...
- Constructing Roads HDU 1102
There are N villages, which are numbered from 1 to N, and you should build some roads such that ever ...
- WordCount2.2
说明: 合作者:201631062507 201631062526(学号) 代码地址:https://gitee.com/WordCountMC/WordCountTeam 本次作业链接:https ...
- Android源码阅读技巧--查找开发者选项中显示触摸操作源码
在开发者模式下,在开发者选项中,可以勾选“显示触摸操作”,然后只要点击屏幕就会在点击的位置有圈圈显示.如何找到绘制圈圈的代码部分,有什么技巧来阅读代码量这么大的android系统源码呢?以下请跟着小老 ...