准备文件

首先准备好测试文件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并不能提前定义时,就需要这种方式来实现了。这种方式必须要遵从如下三个步骤:

  1. 创建一个Rows的RDD
  2. 定义一个Schema(使用StructType)
  3. 使用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相关推荐

  1. spark sql定义RDD、DataFrame与DataSet

    RDD 优点: 编译时类型安全 编译时就能检查出类型错误 面向对象的编程风格 直接通过类名点的方式来操作数据 缺点: 序列化和反序列化的性能开销 无论是集群间的通信, 还是IO操作都需要对对象的结构和 ...

  2. Spark SQL中 RDD 转换到 DataFrame (方法二)

    强调它与方法一的区别:当DataFrame的数据结构不能够被提前定义.例如:(1)记录结构已经被编码成字符串 (2) 结构在文本文件中,可能需要为不同场景分别设计属性等以上情况出现适用于以下方法.1. ...

  3. Spark SQL之RDD, DataFrame, DataSet详细使用

    前言 Spark Core 中,如果想要执行应用程序,需要首先构建上下文环境对象 SparkContext,Spark SQL 其实可以理解为对 Spark Core 的一种封装,不仅仅在模型上进行了 ...

  4. Spark SQL 1.3.0 DataFrame介绍、使用及提供了些完整的数据写入

     问题导读 1.DataFrame是什么? 2.如何创建DataFrame? 3.如何将普通RDD转变为DataFrame? 4.如何使用DataFrame? 5.在1.3.0中,提供了哪些完整的 ...

  5. spark基础之RDD和DataFrame和Dataset比较

    一 SparkSQL简介 Spark SQL是一个能够利用Spark进行结构化数据的存储和操作的组件,结构化数据可以来自外部结构化数据源也可以通过RDD获取. 外部的结构化数据源包括Hive,JSON ...

  6. Spark SQL将rdd转换为数据集-以编程方式指定模式(Programmatically Specifying the Schema)

    一:解释 官网:https://spark.apache.org/docs/latest/sql-getting-started.html 这种场景是生活中的常态 When case classes ...

  7. Spark SQL将rdd转换为数据集-反射来推断Inferring the Schema Using Reflection

    一:解读 官网:https://spark.apache.org/docs/latest/sql-getting-started.html The first method uses reflecti ...

  8. spark基础之RDD和DataFrame的转换方式

    一 通过定义Case Class,使用反射推断Schema 定义Case Class,在RDD的转换过程中使用Case Class可以隐式转换成SchemaRDD,然后再注册成表,然后就可以利用sql ...

  9. spark sql 数据类型转换_spark dataframe 类型转换

    读一张表,对其进行二值化特征转换.可以二值化要求输入类型必须double类型,类型怎么转换呢? 直接利用spark column 就可以进行转换: DataFrame dataset= hive.sq ...

最新文章

  1. ztree树封装 json实例_小白7天入门PHP Web开发 - Day 6[下](综合)个人博客实例讲解用户数据的存储...
  2. 谷歌迈出量子计算开源第一步,推出首个量子机器学习库TensorFlow Quantum
  3. Vue和iview-admin搭建的项目进行兼容
  4. 20、mysql中触发器的使用
  5. 02-MyBatis配置SQL打印
  6. 非科班Java尝试全国高校计算机能力挑战赛第三届计挑赛
  7. 使用jQuery和Pure.CSS创建一个可编辑的表格
  8. PHP socket
  9. 同等质量下那种图片格式小_最实用的Window小工具合集,总有一款适合你!
  10. python进阶09并发之五生产者消费者
  11. 做报表5年,被批Excel毫无新意,能开发的可视化报表让我重获新生
  12. camera - 滤镜格式 (原生RGGB、RCCB、RCCC、RGB-IR和Monochrome(单色传感器))
  13. SEO优化工具,查询死链VisualSEOStudio-2.0.2.3
  14. 最全的关于硬件测试的解读
  15. 官方rom提取原签名工具_官方和第三方ROM的提取与分解
  16. 笔记本电脑外接显示器出现灰屏
  17. 三菱或尝试抛弃后视镜,使用摄像头和AI技术来导航
  18. Qt (高仿Visio)流程图组件开发(二) 基本图元绘制 图元间连线绘制
  19. 怎么把视频转成mp3音频,下面有四个方法
  20. 3KAB,贴片五脚芯片规格书

热门文章

  1. Android调用WebService
  2. oracle 取当天日期减一天 应该如何写
  3. 程序员怎么长久保持新鲜感?
  4. Go的string/int/int64转化
  5. Golang手册与常用包手册
  6. WeChat小程序授权机制踩坑请求头中设置cookie保持session
  7. TP返回原生SQL语句:fetchSql
  8. Go的sync.RWMutex(六)
  9. java antd实现登录,基于 antd pro 的短信验证码登录
  10. mysql 修改数据 where_MySQL笔记之修改数据的解决方法