基于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”文章中首次提出的.时 ...
随机推荐
- unity_小功能实现(敌人巡逻功能)
利用NavMeshAgent控制敌人巡逻,即敌人在一组位置间循环巡逻. 首先我们要知道NavMeshAgent中有两个方法:1.锁定当前巡逻的某一目标位置,即navMeshAgent.destinat ...
- [Python] socket实现TFTP上传和下载
一.说明 本文主要基于socket实现TFTP文件上传与下载. 测试环境:Win10/Python3.5/tftpd64. tftpd下载:根据自己的环境选择下载,地址 :http://tftpd32 ...
- [PHP] 遗传算法求函数最大值一般实现
需求:求解函数 f(x) = x + 10*sin(5*x) + 7*cos(4*x) 在区间[0,9]的最大值. <?php /* 需求:求解函数 f(x) = x + 10*sin(5*x) ...
- mysql where、group by、having
今天重新温习一遍mysql的知识 先来讲讲where.group by.having group by :是将记录中的数据,按照条件进行分组: having:是将分组后的数据加上条件筛选,区别于whe ...
- The Best Path(HDU5883)[欧拉路]2016青岛online
题库链接:http://acm.hdu.edu.cn/showproblem.php?pid=5883 欧拉回路裸题,第一次接触欧拉路的我是真的长见识了^-^ 懂了欧拉路这道题就是没什么问题了,欧拉路 ...
- rocketmq 部署启动指南-Docker 版
最近学习使用 rocketmq,需要搭建 rocketmq 服务端,本文主要记录 rocketmq 搭建过程以及这个过程踩到的一些坑. 准备工作 在搭建之前,我们需要做一些准备工作,这里我们需要使用 ...
- Codefroces 920F SUM and REPLACE(线段树)
SUM and REPLACE 题意:给你n个数,进行m次操作,分别是将区间[l,r]内的所有数替换成自己的因子数 和 对区间[l,r]进行求和. 题解:可以发现2的因子个数还是2,1的因子个数还是1 ...
- lightoj 1074 - Extended Traffic(spfa+负环判断)
题目链接:http://www.lightoj.com/volume_showproblem.php?problem=1074 题意:有n个城市,每一个城市有一个拥挤度ai,从一个城市I到另一个城市J ...
- 【Ehcache】基础知识学习
一.Ehcache概述 1.1 简介 1.2 Ehcache的主要特性 二.Ehcache使用介绍 2.1 Ehcache缓存过期策略 2.2 如何解决缓存与db不同步的问题. 三.Ehcache 基 ...
- Tomcat原理系列之六:详解socket如何封装成request(上)
目录 参与者 总结 @(详解socket如何封装成request) 看源码虽然不能马上提升你的编码水平.但能让你更好的理解编程. 因为我们tomcat多是以NIO形式处理请求,所以本系列讲的都是NIO ...