【极简spark教程】DataFrame常用操作
目录
创建DataFrame
List,toDF:使用List[Tuple]包装每行记录,结合toDF接口,,转化为DataFrame
DataFrameRDD,StructType:推荐使用RDD和schema,生成DataFrame
RDD,StructType:补充,单个元素构成一行记录,使用Row.apply()
RDD,StructType:补充,多个元素构成一行记录,使用Row.fromSeq()
List.map(beanClass(_)):使用case class包装每行记录,借助case class参数列表定义字段信息,每个属性名都会成为DataFrame的列名
RDD.map(beanClass(_)):使用RDD,生成createDataFrame
将RDD转化为DataFrame
按行操作
DataFrame操作大全
展示数据
收集数据
显示指定字段的描述统计信息
获取头部数据
常用sql操作
1. 创建DataFrame
List,toDF:使用List[Tuple]包装每行记录,结合toDF接口,
,转化为DataFrame
val df = spark.createDataFrame(List( ("ming", 20, 15552211521L), ("hong", 19, 13287994007L), ("zhi", 21, 15552211523L) )).toDF("name", "age", "phone")
DataFrame
RDD,StructType:推荐使用RDD和schema,生成DataFrame
import org.apache.spark.sql.Row import org.apache.spark.sql.types._ val testRdd = sc.parallelize(List(List(1,1),List(2,2))).map(line => Row(line(0), line(1))) val schema = StructType(List(StructField("id", IntegerType, nullable = true), StructField("code", IntegerType, nullable = true))) val df = spark.createDataFrame(testRdd, schema)
RDD,StructType:补充,单个元素构成一行记录,使用Row.apply()
import org.apache.spark.sql.Row import org.apache.spark.sql.types._ val testRdd = sc.parallelize(List(Row.apply(1), Row.apply(2), Row.apply(3))) val schema = StructType(List(StructField("id", IntegerType, nullable = true))) val df = spark.createDataFrame(testRdd, schema)
RDD,StructType:补充,多个元素构成一行记录,使用Row.fromSeq()
import org.apache.spark.sql.Row import org.apache.spark.sql.types._ val testRdd = sc.parallelize(List(Row.fromSeq(List(1,"lijp",99.0)), Row.fromSeq(List(2,"zhangs",85.5)), Row.fromSeq(3,"lis",60.0)))) val schema = StructType(List(StructField("id", IntegerType, nullable = true), StructField("name", StringType, nullable = true), StructField("score", DoubleType, nullable = true))) val df = spark.createDataFrame(testRdd, schema)
List.map(beanClass(_)):使用case class包装每行记录,借助case class参数列表定义字段信息,每个属性名都会成为DataFrame的列名
case class Test(Field1:Int, Field2:Int) val df = spark.createDataFrame(List(List(1,1),List(2,2),List(3,3)).map(line => Test(line(0),line(1))))
RDD.map(beanClass(_)):使用RDD,生成createDataFrame
case class Test(Field1:Int, Field2:Int) val testRdd = sc.parallelize(List(List(1,1), List(2,2))) val df = spark.createDataFrame(testRdd.map(line => Test(line(0), line(1))))
将RDD转化为DataFrame
import spark.sqlContext.implicits._ import spark.implicits._ case class Line(uid: String, tag:String, time:String, freq:String) val df = sc.textFile(path).map(line => line.split("\\|")).map(line => Line(line(0), line(1), line(2), line(3))).toDF()
按行操作
// 根据索引操作 df.map(tag=> "tagcode: " + tag(2)).show() // 根据键操作 df.map(tag=> "tagcode: " + tag.getAs[String]("tagcode")).show()
DataFrame操作大全
展示数据
// 显示十行数据 df.show(10, false)
收集数据
// 收集所有结果数据,返回一个Array df.collect() // 收集所有结果数据,返回一个List df.collectAsList()
显示指定字段的描述统计信息
df.describe("user").show()
获取头部数据
df.first() df.head() df.take() df.takeAsList()
常用sql操作
// where:传入sql字符串 df.where("user=1 or type ='助手1'").show()//filter:传入sql字符串 df.filter("user=1 or type ='助手1'").show()// like:模糊匹配,需要和where一起用 df.where(data("uid").like("%lijp%")).show()// like取反 df.where(!data("uid").like("%lijp%")).show()// 当使用$"uid"时,不支持like操作,但是可以使用col对新增列进行模糊匹配 functions.col("uid").like("%lijp%")// isin:df中进行in操作需要结合where或者withColumn,isin方法接受变长参数列表 this.where(col("uid").isin("user1","user2","user3"))// isin:如果isin需要传入List,则需要对List进行列表解析 this.where(col("uid").isin(List("user1","user2","user3"):_*))// 复合操作:1-collect,将对应dataframe作为List[Row]取回,2-map,从每一行Row中使用getAs[转化类型]("列名"),3-:_*,列表解析元素逐个处理 this.where(col("uid").isin(that.select("uid").distinct().collect().map(_.getAs[String]("uid")):_*))// select:获取指定字段,可以对字段进行简单逻辑处理 df.select("user","type").show() 或者 df.select(df("user"),df("user")).show()// selectExpr:传入UDF、函数、as别名 df.selectExpr("user","type as visittype","to_date(visittime)").show()// col/apply:获取指定字段,作用同df("user")一样 df.col("user")// limit:获取指定DataFrame的前n行记录,不同于head、take,limit不是action操作// orderBy:按指定字段排序,默认为升序 df.orderBy("visittime").show(false)// orderBy:降序排列 df.orderBy(df("visittime").desc).show(false)// group by数据分组 df.groupBy("user").show() // 传入字段名 df.groupBy(df("user")).show() // 传入column对象 df.groupBy("user").count().show() // 配合聚合函数使用:// distinct:去重 df.distinct()// drop:去除指定字段,保留其他字段 df.drop("type").show()//agg:聚合操作 df.groupBy("user").agg(max("id"),sum("user")).show() df.agg("id"->"max","user"->"sum").show()//withColumn:添加新的一列 df.withColumn("sex",df("user")%2).show() // 添加新的列 df.withColumn("newname",df("oldname")).show() // 覆盖旧的列 import org.apache.spark.sql.functions.lit // 添加常数列 val newdf = df.withColumn("newcol",lit("myval"))// join:连接 df.join(df2,Seq("id")) // 根据指定列聚合(左表、右表都含有指定的字段名,聚合后结果只保留唯一的指定字段名) df.join(df2,df("id")===df2("id")) //根据指定列连接(左表、右表都含有指定的字段名,聚合后结果保留各自的指定字段名)// between:范围筛选,包含两端边界 df.where(col("visittime").between(1,3))
【极简spark教程】DataFrame常用操作相关推荐
- python spark dataframe_pyspark dataframe 常用操作
spark dataframe派生于RDD类,但是提供了非常强大的数据操作功能.当然主要对类SQL的支持. 在实际工作中会遇到这样的情况,主要是会进行两个数据集的筛选.合并,重新入库. 首先加载数据集 ...
- 【极简spark教程】spark聚合函数
聚合函数分为两类,一种是spark内置的常用聚合函数,一种是用户自定义聚合函数 UDAF 不带类型的UDAF[较常用] 继承UserDefinedAggregateFunction 定义输入数据的sc ...
- 【极简spark教程】RDD编程
目录 入门 RDD编程指引 创建rdd集合,可以将rdd看做是spark分布式环境下的list 读取文件 RDD操作 转换transform:生成了新的RDD 行动action:汇总所有结果返回驱动程 ...
- Spark SQL概述,DataFrames,创建DataFrames的案例,DataFrame常用操作(DSL风格语法),sql风格语法
一. Spark SQL 1. Spark SQL概述 1.1. 什么是Spark SQL Spark SQL是Spark用来处理结构化数据的一个模块,它提供了一个编程抽象叫做DataFrame并且作 ...
- tensorflow平台极简方式_TensorFlow极简入门教程
原标题:TensorFlow极简入门教程 随着 TensorFlow 在研究及产品中的应用日益广泛,很多开发者及研究者都希望能深入学习这一深度学习框架.本文介绍了TensorFlow 基础,包括静态计 ...
- 你好Python -- 极简Python教程
你好Python -- 极简Python教程 本教程针对Python业余爱好者,展示入门级的编程知识. 目录 你好Python -- 极简Python教程 一. 你好Python! 二. 我想对Pyt ...
- Nginx 极简入门教程
Nginx 极简入门教程 基本介绍 Nginx 是一个高性能的 HTTP 和反向代理 web 服务器,同时也提供了 IMAP/POP3/SMTP服务. Nginx 是由伊戈尔·赛索耶夫为俄罗斯访问量第 ...
- Python极简入门教程
前言 为了方便各位小白能轻松入门Python,同时加深自己对Python的理解,所以创造了"Python极简入门教程",希望能帮到大家,若有错误请多指正,谢谢.极简入门教程代表着不 ...
- pyecharts极简入门教程
作者:luanhz 来源:小数志 导读 数据可视化是整个数据分析流程中的关键环节,甚至有着一图定成败的关键性地位.前期,陆续推出了matplotlib和seaborn详细入门教程,对于常规的数据探索和 ...
最新文章
- 【机器学习入门】(8) 线性回归算法:正则化、岭回归、实例应用(房价预测)附python完整代码和数据集
- 正则表达式——全部符号解释(详解)
- 启明云端分享|ESP32-C3-MINI-1和ESP32-C3-MINI-1U的区别是什么?
- PHP $_SERVER 变量
- Qt QMYSQL driver not loaded 解决办法
- 用最简单的操作,做最精准的AI模型!
- python面试 hashmap是什么_面试不慌,看完保证让你写HashMap跟玩一样
- Vscode多个窗口显示多个选项卡/Tabs
- php聊天室把数据存在缓存里,php聊天室信息存储的问题
- 软件测试初学者如何编写Jmeter测试脚本?
- EXCEL常规格式数字转换为日期时间格式的方法
- bzoj4816 Sdoi2017 数字表格
- 深度学习概念名词解释总结
- 每一个圣人都有一个过去
- 2018.10.19学习总结
- MySQL高级2-优化分析
- 用计算机做课文成音乐,用计算机音乐制作手机铃声的理论与实践.pdf
- Git统计一段时间内代码的修改量
- WPF帝友借贷系统MV模式开发日志2021/04/02_前台登入注册页面搭建
- 电脑Windows使用中遇到的那些问题