写在前面:

当得到一个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】的更多相关文章

  1. 且谈 Apache Spark 的 API 三剑客:RDD、DataFrame 和 Dataset

    作者:Jules S. Damji 译者:足下 本文翻译自 A Tale of Three Apache Spark APIs: RDDs, DataFrames, and Datasets ,翻译已 ...

  2. MySQL(一) -- MySQL学习路线、数据库的基础、关系型数据库、关键字说明、SQL、MySQL数据库、MySQL服务器对象、SQL的基本操作、库操作、表操作、数据操作、中文数据问题、 校对集问题、web乱码问题

    1 MySQL学习路线 基础阶段:MySQL数据库的基本操作(增删改查),以及一些高级操作(视图.触发器.函数.存储过程等). 优化阶段:如何提高数据库的效率,如索引,分表等. 部署阶段:如何搭建真实 ...

  3. 基于Oracle的SQL优化(社区万众期待 数据库优化扛鼎巨著)

    基于Oracle的SQL优化(社区万众期待数据库优化扛鼎巨著) 崔华 编   ISBN 978-7-121-21758-6 2014年1月出版 定价:128.00元 856页 16开 编辑推荐 本土O ...

  4. 基于iSCSI的SQL Server 2012群集测试(四)--模拟群集故障转移

    6.模拟群集故障转移 6.1 模拟手动故障转移(1+1) 模拟手动故障转移的目的有以下几点: 测试群集是否能正常故障转移 测试修改端口是否能同步到备节点 测试禁用full-text和Browser服务 ...

  5. 数据库 基于索引的SQL语句优化之降龙十八掌(转)

    一篇挺不错的关于SQL语句优化的文章,因不知原始出处,故未作引用说明! 1 前言      客服业务受到SQL语句的影响非常大,在规模比较大的局点,往往因为一个小的SQL语句不够优化,导致数据库性能急 ...

  6. 基于oracle的sql优化

    [基于oracle的sql优化] 基于oracle的sql优化 [博主]高瑞林 [博客地址]http://www.cnblogs.com/grl214 一.编写初衷描述 在应有系统开发初期,由于数据库 ...

  7. 转://从一条巨慢SQL看基于Oracle的SQL优化

    http://mp.weixin.qq.com/s/DkIPwbDKIjH2FMN13GkT4w 本次分享的内容是基于Oracle的SQL优化,以一条巨慢的SQL为例,从快速解读SQL执行计划.如何从 ...

  8. 2019年5月1日起安卓应用应基于API 26开发,那么API等级是啥?

    2019年5月1日起安卓应用应基于API 26开发,那么API等级是啥? 转 https://www.ithome.com/html/android/372234.htm   据泰尔终端实验室公众微信 ...

  9. 基于时间的 SQL注入研究

    SQL注入攻击是业界一种非常流行的攻击方式,是由rfp在1998年<Phrack>杂志第54期上的“NT Web Technology Vulnerabilities”文章中首次提出的.时 ...

随机推荐

  1. [原创] Nginx1.13版本reload过程对TCP包影响的测试

    Nginx1.13版本reload过程中各项连接情况和状态的测试.测试Nginx1.13 Reload过程中,对客户端和服务器的TCP层面的包影响.     1)对客户端开启长连接,服务端开启/不开启 ...

  2. 学测试,看视频?NONONO,除非这种情况

    001 前言 : 很久没周末写文章了,一个是要睡懒觉.另外一个是,周末写了大家也没有心思看(加班1周了,好不容易周末,你又让我学习 ?先睡个懒觉再说,去TM的学习). 然而,今天早早的5点就起床了,处 ...

  3. 一文看尽Java-Thread

    一.前言      主要分成两部说起:Thread源码解读和常见面试题解答,废话不多说开始: 二.源码解读 首先看下构造函数,构造函数都是通过调用init方法对属性进行初始化,主要是对线程组.线程名字 ...

  4. Nginx入门(一):在centos上安装nginx

    CenterOS7安装Nginx =================== 参考:https://www.xuliangwei.com/bgx/972.html nginx官网下载地址:http://n ...

  5. [企业微信通知系列]Jenkins发布后自动通知

    一.前言 最近使用Jenkins进行自动化部署,但是部署后,并没有相应的通知,虽然有邮件发送通知,但是发现邮件会受限于接收方的接收设置,导致不能及时看到相关的发布内容.而由于公司使用的是企业微信,因此 ...

  6. Angular Material 的设计之美

    前言 Angular Material 作为 Angular 的官方组件库,无论是设计交互还是易用性都有着极高的质量.正如官方所说其目的就是构建基于 Angular 和 Typescript 的高质量 ...

  7. Python字典排序问题

    字典的问题 navagation: 1.问题来源 2.dict的学习 *3.numpy的应用 1.问题来源 在做cs231n,assigment1-kNN实现的时候,需要对一个列表中的元素进行计数,并 ...

  8. POJ 1797-Heavy Transportation-dijkstra小变形和POJ2253类似

    传送门:http://poj.org/problem?id=1797 题意: 在起点和终点间找到一条路,使得经过的边的最小值是最大的: 和POJ2253类似,传送门:http://www.cnblog ...

  9. codeforces 872 D. Something with XOR Queries(思维)

    题目链接:http://codeforces.com/contest/872/problem/D 题意:给你一个排列p和对应的位置b也就是说p[b[i]]=i,然后给你最多询问2*n次找出所有的p排列 ...

  10. Codeforces 416D Population Size

    Population Size 题意: 一共n个数, 每个-1都可以变成一个正数, 现在要求最少数目的等差子序列,并且在这个子序列必须要连着截取一段,不能分开截取. 样例1: 8 6 4 2 1 4 ...