Spark SQL之RDD转DataFrame
准备文件
首先准备好测试文件info.txt
,内容如下:
1,vincent,20
2,sarah,19
3,sofia,29
4,monica,26
将RDD转成DataFrame
方式一:反射
可以使用反射来推断包含了特定数据类型的RDD的元数据
代码如下:
package cn.ac.iie.sparkimport org.apache.spark.sql.SparkSession/*** DataFrame和RDD的互操作*/
object DataFrameRDDApp {def main(args: Array[String]): Unit = {val sparkSessionApp = SparkSession.builder().appName("DataFrameRDDApp").master("local[2]").getOrCreate()// 将RDD转成DataFrameval rdd = sparkSessionApp.sparkContext.textFile("file:///E:/test/infos.txt")// 注意需要导入隐式转换import sparkSessionApp.implicits._val infoDF = rdd.map(_.split(",")).map(line => Info(line(0).toInt, line(1), line(2).toInt)).toDF()infoDF.show()sparkSessionApp.close()}case class Info(id:Int, name:String, age:Int){}
}
当得到DataFrame之后就可以进行其他的相应操作了,例如进行过滤:infoDF.filter(infoDF.col("age") > 25).show()
:输出如下:
随后可以将DataFrame转成一张表。
我们可以通过infoDF.createOrReplaceTempView("infos")
注册成一张表,好处就是可以直接通过SQL的方式进行处理。
infoDF.createOrReplaceTempView("infos")sparkSessionApp.sql("select * from infos where age > 25").show()
方式二:编程方式
当我们的Schema并不能提前定义时,就需要这种方式来实现了。这种方式必须要遵从如下三个步骤:
- 创建一个Rows的RDD
- 定义一个Schema(使用StructType)
- 使用createDataFrame将schema作用于Rows
代码试下如下:
package cn.ac.iie.sparkimport org.apache.spark.sql.types.{IntegerType, StringType, StructField, StructType}
import org.apache.spark.sql.{Row, SparkSession}/*** DataFrame和RDD的互操作*/
object DataFrameRDDApp {def main(args: Array[String]): Unit = {val sparkSessionApp = SparkSession.builder().appName("DataFrameRDDApp").master("local[2]").getOrCreate()// infoReflection(sparkSessionApp)program(sparkSessionApp)sparkSessionApp.close()}private def program(sparkSessionApp: SparkSession) = {val rdd = sparkSessionApp.sparkContext.textFile("file:///E:/test/infos.txt")val infoRDD = rdd.map(_.split(",")).map(line => Row(line(0).toInt, line(1), line(2).toInt))val structType = StructType(Array(StructField("id", IntegerType, true),StructField("name", StringType, true),StructField("age", IntegerType, true)))val infoDF = sparkSessionApp.createDataFrame(infoRDD, structType)infoDF.printSchema()infoDF.show()}private def infoReflection(sparkSessionApp: SparkSession) = {// 将RDD转成DataFrameval rdd = sparkSessionApp.sparkContext.textFile("file:///E:/test/infos.txt")// 注意需要导入隐式转换import sparkSessionApp.implicits._val infoDF = rdd.map(_.split(",")).map(line => Info(line(0).toInt, line(1), line(2).toInt)).toDF()infoDF.show()infoDF.filter(infoDF.col("age") > 25).show()infoDF.createOrReplaceTempView("infos")sparkSessionApp.sql("select * from infos where age > 25").show()}case class Info(id:Int, name:String, age:Int){}
}
这种方式拿到DataFrame之后,依然可以进行其他的相关API操作。
两种方式的优缺点
DataFrame和RDD互操作的两种方式:
反射:case class。
这种方式事先需要知道你的字段、字段类型
编程方式:Row
如果第一种情况不能满足要求,无法事先知道字段与类型
优先考虑第一种方式。因为实现较为简单。
总结:DataFrame = RDD + Schema
RDD仅仅知道里面装的是什么对象(user),但是无法知道这个user里有哪些属性,以及属性的字段是什么类型的。所以我们直接处理RDD是有一定的困难,因此需要自己执行Schema表结构,将Schema作用于RDD中,就可以看做是一个表了。接下来就可以方便的进行操作了。
同时DataFrame优势:DataFrame底层使用了Catalyst进行优化。
DataFrame还支持text、json、parquet以及其他外部数据源格式。将外部数据源的数据注册到sparksql中,成为DataFrame,然后就可以使用DataFrame自身提供的API进行操作了。或者可以注册成一张表执行sql语句。执行自己的API或sql,最终形成的逻辑执行计划都是一样的。
Spark SQL之RDD转DataFrame相关推荐
- spark sql定义RDD、DataFrame与DataSet
RDD 优点: 编译时类型安全 编译时就能检查出类型错误 面向对象的编程风格 直接通过类名点的方式来操作数据 缺点: 序列化和反序列化的性能开销 无论是集群间的通信, 还是IO操作都需要对对象的结构和 ...
- Spark SQL中 RDD 转换到 DataFrame (方法二)
强调它与方法一的区别:当DataFrame的数据结构不能够被提前定义.例如:(1)记录结构已经被编码成字符串 (2) 结构在文本文件中,可能需要为不同场景分别设计属性等以上情况出现适用于以下方法.1. ...
- Spark SQL之RDD, DataFrame, DataSet详细使用
前言 Spark Core 中,如果想要执行应用程序,需要首先构建上下文环境对象 SparkContext,Spark SQL 其实可以理解为对 Spark Core 的一种封装,不仅仅在模型上进行了 ...
- Spark SQL 1.3.0 DataFrame介绍、使用及提供了些完整的数据写入
问题导读 1.DataFrame是什么? 2.如何创建DataFrame? 3.如何将普通RDD转变为DataFrame? 4.如何使用DataFrame? 5.在1.3.0中,提供了哪些完整的 ...
- spark基础之RDD和DataFrame和Dataset比较
一 SparkSQL简介 Spark SQL是一个能够利用Spark进行结构化数据的存储和操作的组件,结构化数据可以来自外部结构化数据源也可以通过RDD获取. 外部的结构化数据源包括Hive,JSON ...
- Spark SQL将rdd转换为数据集-以编程方式指定模式(Programmatically Specifying the Schema)
一:解释 官网:https://spark.apache.org/docs/latest/sql-getting-started.html 这种场景是生活中的常态 When case classes ...
- Spark SQL将rdd转换为数据集-反射来推断Inferring the Schema Using Reflection
一:解读 官网:https://spark.apache.org/docs/latest/sql-getting-started.html The first method uses reflecti ...
- spark基础之RDD和DataFrame的转换方式
一 通过定义Case Class,使用反射推断Schema 定义Case Class,在RDD的转换过程中使用Case Class可以隐式转换成SchemaRDD,然后再注册成表,然后就可以利用sql ...
- spark sql 数据类型转换_spark dataframe 类型转换
读一张表,对其进行二值化特征转换.可以二值化要求输入类型必须double类型,类型怎么转换呢? 直接利用spark column 就可以进行转换: DataFrame dataset= hive.sq ...
最新文章
- ztree树封装 json实例_小白7天入门PHP Web开发 - Day 6[下](综合)个人博客实例讲解用户数据的存储...
- 谷歌迈出量子计算开源第一步,推出首个量子机器学习库TensorFlow Quantum
- Vue和iview-admin搭建的项目进行兼容
- 20、mysql中触发器的使用
- 02-MyBatis配置SQL打印
- 非科班Java尝试全国高校计算机能力挑战赛第三届计挑赛
- 使用jQuery和Pure.CSS创建一个可编辑的表格
- PHP socket
- 同等质量下那种图片格式小_最实用的Window小工具合集,总有一款适合你!
- python进阶09并发之五生产者消费者
- 做报表5年,被批Excel毫无新意,能开发的可视化报表让我重获新生
- camera - 滤镜格式 (原生RGGB、RCCB、RCCC、RGB-IR和Monochrome(单色传感器))
- SEO优化工具,查询死链VisualSEOStudio-2.0.2.3
- 最全的关于硬件测试的解读
- 官方rom提取原签名工具_官方和第三方ROM的提取与分解
- 笔记本电脑外接显示器出现灰屏
- 三菱或尝试抛弃后视镜,使用摄像头和AI技术来导航
- Qt (高仿Visio)流程图组件开发(二) 基本图元绘制 图元间连线绘制
- 怎么把视频转成mp3音频,下面有四个方法
- 3KAB,贴片五脚芯片规格书