RDD&Dataset&DataFrame
Dataset创建
object DatasetCreation {
def main(args: Array[String]): Unit = {
val spark = SparkSession
.builder()
.appName("SparkSessionTest")
.getOrCreate()
import spark.implicits._
//1: range
val ds1 = spark.range(0, 10, 2, 2)
ds1.show()
val dogs = Seq(Dog("jitty", "red"), Dog("mytty", "yellow"))
val cats = Seq(new Cat("jitty", 2), new Cat("mytty", 4))
//2: 从Seq[T]中创建
val data = dogs
val ds = spark.createDataset(data)
ds.show()
//3: 从RDD[T]中创建
val dogRDD = spark.sparkContext.parallelize(dogs)
val dogDS = spark.createDataset(dogRDD)
dogDS.show()
val catRDD = spark.sparkContext.parallelize(cats)
//val catDSWithoutEncoder = spark.createDataset(catRDD)
val catDS = spark.createDataset(catRDD)(Encoders.bean(classOf[Cat]))
catDS.show()
//Encoders 负责JVM对象类型与spark SQL内部数据类型之间的转换
val intDs = Seq(1, 2, 3).toDS() // implicitly provided (spark.implicits.newIntEncoder)
val seqIntDs = Seq(Seq(1), Seq(2), Seq(3)).toDS() // implicitly provided (spark.implicits.newIntSeqEncoder)
val arrayIntDs = Seq(Array(1), Array(2), Array(3)).toDS() // implicitly provided (spark.implicits.newIntArrayEncoder)
//支持的Encoders有如下:
Encoders.product //tuples and case classes
Encoders.scalaBoolean
Encoders.scalaByte
Encoders.scalaDouble
Encoders.scalaFloat
Encoders.scalaInt
Encoders.scalaLong
Encoders.scalaShort
Encoders.bean(classOf[Cat])
spark.stop()
}
}
DataFrame创建
import org.apache.spark.sql.types.{IntegerType, StringType, StructField, StructType}
import org.apache.spark.sql.{Row, SparkSession}
object DataFrameCreation {
def main(args: Array[String]): Unit = {
val spark = SparkSession
.builder()
.appName("SparkSessionTest")
.getOrCreate()
//1: 从RDD[A <: Product]中创建, case class 和 tuple都是Product的子类
val rdd = spark.sparkContext.textFile("").map(line => {
val splitData = line.split(",")
Dog(splitData(0), splitData(1))
})
val tupleRDD = spark.sparkContext.parallelize(Seq(("jitty", 2), ("mytty", 4)))
spark.createDataFrame(rdd)
spark.createDataFrame(tupleRDD)
val dogRDD = spark.sparkContext.parallelize(Seq(Dog("jitty", "red"), Dog("mytty", "yellow")))
val dogDf = spark.createDataFrame(dogRDD)
dogDf.show()
//2: 从Seq[A <: Product]中创建
val dogSeq = Seq(Dog("jitty", "red"), Dog("mytty", "yellow"))
spark.createDataFrame(dogSeq).show()
//3:用RDD[_] + class创建,这个class是java的bean
val catRDD = spark.sparkContext.parallelize(Seq(new Cat("jitty", 2), new Cat("mytty", 4)))
//val catDf = spark.createDataFrame(catRDD)
val catDf = spark.createDataFrame(catRDD, classOf[Cat])
catDf.show()
catDf.createOrReplaceTempView("cat")
spark.sql("select * from cat").show() //需要注意的是查询出来的cat的属性的顺序是不固定的
//4: 用RDD[Row] + schema创建
val rowSeq = Seq("tom,30", "katy, 46").map(_.split(",")).map(p => Row(p(0), p(1).trim.toInt))
val rowRDD = spark.sparkContext.parallelize(rowSeq)
val schema =
StructType(
StructField("name", StringType, false) ::
StructField("age", IntegerType, true) :: Nil)
val dataFrame = spark.createDataFrame(rowRDD, schema)
dataFrame.printSchema
dataFrame.show()
//5: 从外部数据源中创建
val df = spark.read.json(s"${BASE_PATH}/IoT_device_info.json")
df.show()
spark.stop()
}
}
RDD&Dataset&DataFrame的转换
package com.twq.dataset.creation
import com.twq.dataset.Dog
import org.apache.spark.rdd.RDD
import org.apache.spark.sql.{Row, SparkSession} object RDDDatasetTransform {
def main(args: Array[String]): Unit = {
val spark = SparkSession
.builder()
.appName("RDDDatasetTransform")
.getOrCreate() val dogs = Seq(Dog("jitty", "red"), Dog("mytty", "yellow")) val dogRDD = spark.sparkContext.parallelize(dogs) //1: RDD转DataFrame
import spark.implicits._
val dogDF = dogRDD.toDF()
dogDF.show() val renameSchemaDF = dogRDD.toDF ("first_name", "lovest_color")
renameSchemaDF.show() //2: DataFrame转RDD, schema信息丢掉了
val dogRowRDD: RDD[Row] = dogDF.rdd
dogRowRDD.collect()
renameSchemaDF.rdd.collect() //3: RDD转Dataset
val dogDS = dogRDD.toDS()
dogDS.show() //4: Dataset转RDD
val dogRDDFromDs: RDD[Dog] = dogDS.rdd
dogRDDFromDs.collect() //5: DataFrame转Dataset
val dogDsFromDf = dogDF.as[Dog]
dogDsFromDf.show() //6: Dataset转DataFrame
val dogDfFromDs = dogDsFromDf.toDF()
dogDfFromDs.show() spark.stop()
}
}
schema的定义以及复杂数据类型的用法
import org.apache.spark.sql.types._
import org.apache.spark.sql.{Row, SaveMode, SparkSession} object SchemaApiTest {
def main(args: Array[String]): Unit = {
val spark = SparkSession
.builder()
.appName("SchemaApiTest")
.master("local")
.getOrCreate() val iotDeviceDf = spark.read.json(s"${BASE_PATH}/IoT_device_info.json") iotDeviceDf.toString() //1: schema的展示
iotDeviceDf.schema
iotDeviceDf.printSchema() //2: schema中可以有复杂数据类型
val schema =
StructType(
StructField("name", StringType, false) ::
StructField("age", IntegerType, true) ::
StructField("map", MapType(StringType, StringType), true) ::
StructField("array", ArrayType(StringType), true) ::
StructField("struct",
StructType(Seq(StructField("field1", StringType), StructField("field2", StringType))))
:: Nil) val people =
spark.sparkContext.parallelize(Seq("tom,30", "katy, 46")).map(_.split(",")).map(p =>
Row(p(0), p(1).trim.toInt, Map(p(0) -> p(1)), Seq(p(0), p(1)), Row("value1", "value2")))
val dataFrame = spark.createDataFrame(people, schema)
dataFrame.printSchema
dataFrame.show() dataFrame.select("map").collect().map(row => row.getAs[Map[String, String]]("map"))
dataFrame.select("array").collect().map(row => row.getAs[Seq[String]]("array"))
dataFrame.select("struct").collect().map(row => row.getAs[Row]("struct")) //schema 的用处
val exampleSchema = new StructType().add("name", StringType).add("age", IntegerType)
exampleSchema("name") ///提取name信息,类型
exampleSchema.fields //所有字段类型信息
exampleSchema.fieldNames// 所有字段名字
exampleSchema.fieldIndex("name")/// 字段索引位置 //1:查看一个parquet文件的schema
val sessionDf = spark.read.parquet(s"${BASE_PATH}/trackerSession")
sessionDf.schema
sessionDf.printSchema() //2:比对两个parquet文件的schema是否相同
val changedSchemaFieldNames = sessionDf.schema.fieldNames.map(fieldName => {
if (fieldName == "pageview_count") {
"pv_count"
} else fieldName
})
sessionDf.toDF(changedSchemaFieldNames:_*).write.mode(SaveMode.Overwrite).parquet(s"${BASE_PATH}/trackerSession_changeSchema")
val schemaChangeSessionDf = spark.read.parquet(s"${BASE_PATH}/trackerSession_changeSchema")
schemaChangeSessionDf.schema
schemaChangeSessionDf.printSchema() val oldSchema = sessionDf.schema val changeSchema = schemaChangeSessionDf.schema oldSchema == changeSchema //false //3:两个parquet文件的schema不一样,需要进行统一
val allSessionError
= spark.read.parquet(s"${BASE_PATH}/trackerSession", s"${BASE_PATH}/trackerSession_changeSchema")
allSessionError.printSchema()
allSessionError.show() val allSessionRight = sessionDf.toDF(changeSchema.fieldNames:_*).union(schemaChangeSessionDf)
allSessionRight.printSchema()
allSessionRight.show() spark.stop() }
}

RDD&Dataset&DataFrame的更多相关文章
- RDD/Dataset/DataFrame互转
1.RDD -> Dataset val ds = rdd.toDS() 2.RDD -> DataFrame val df = spark.read.json(rdd) 3.Datase ...
- Spark提高篇——RDD/DataSet/DataFrame(一)
该部分分为两篇,分别介绍RDD与Dataset/DataFrame: 一.RDD 二.DataSet/DataFrame 先来看下官网对RDD.DataSet.DataFrame的解释: 1.RDD ...
- Spark提高篇——RDD/DataSet/DataFrame(二)
该部分分为两篇,分别介绍RDD与Dataset/DataFrame: 一.RDD 二.DataSet/DataFrame 该篇主要介绍DataSet与DataFrame. 一.生成DataFrame ...
- RDD、DataFrame和DataSet的区别
原文链接:http://www.jianshu.com/p/c0181667daa0 RDD.DataFrame和DataSet是容易产生混淆的概念,必须对其相互之间对比,才可以知道其中异同. RDD ...
- 谈谈RDD、DataFrame、Dataset的区别和各自的优势
在spark中,RDD.DataFrame.Dataset是最常用的数据类型,本博文给出笔者在使用的过程中体会到的区别和各自的优势 共性: 1.RDD.DataFrame.Dataset全都是spar ...
- spark RDD,DataFrame,DataSet 介绍
弹性分布式数据集(Resilient Distributed Dataset,RDD) RDD是Spark一开始就提供的主要API,从根本上来说,一个RDD就是你的数据的一个不可变的分布式元素集合,在 ...
- RDD、DataFrame、Dataset三者三者之间转换
转化: RDD.DataFrame.Dataset三者有许多共性,有各自适用的场景常常需要在三者之间转换 DataFrame/Dataset转RDD: 这个转换很简单 val rdd1=testDF. ...
- RDD、DataFrame、Dataset
RDD是Spark建立之初的核心API.RDD是不可变分布式弹性数据集,在Spark集群中可跨节点分区,并提供分布式low-level API来操作RDD,包括transformation和actio ...
- RDD、DataFrame和DataSet
简述 RDD.DataFrame和DataSet是容易产生混淆的概念,必须对其相互之间对比,才可以知道其中异同:DataFrame多了数据的结构信息,即schema.RDD是分布式的 Java对象的集 ...
随机推荐
- 修改kvm宿主机主机名后
修改了宿主机的主机名后, libvirtd错误日志如下 virNetSocketReadWire: : End of file while reading data: Input/output err ...
- 16 SpringMVC 的请求参数的绑定与常用注解
1.SpringMVC 绑定请求参数 (1)支持的数据类型 基本类型参数: 包括基本类型和 String 类型POJO 类型参数: 包括实体类,以及关联的实体类数组和集合类型参数: 包括 List 结 ...
- Linux nfs服务讲解
nfs服务介绍 nfs(Network File System) 网络文件系统,能使用户访问服务器的文件系统,就像访问自己的本机的文件系统一样,并且多个 客户端共享访问该文件系统. 目前nfs服务,较 ...
- composer安装FOSUserBundle内存溢出
内存溢出异常: Fatal error: Allowed memory size of 2147483648 bytes exhausted (tried to allocate 4096 bytes ...
- Python知识点总结篇(一)
Python基础 变量 变量类型: 1.数字型 整形:int: 浮点型:float: 布尔型:bool,True和False: 复数型:complex: 2.非数字型 字符串: 列表: 元祖: 字典: ...
- 华为云·寻找黑马程序员#【代码重构之路】如何“消除”if/else【华为云技术分享】
1. 背景 if/else是高级编程语言中最基础的功能,虽然 if/else 是必须的,但滥用 if/else,特别是各种大量的if/else嵌套,会对代码的可读性.可维护性造成很大伤害,对于阅读代码 ...
- Android 系统架构 和 各个版本代号介绍
一.Android 系统架构: 1. linux内核层Android 基于Linux内核,为Android设备的各种硬件提供底层驱动 比如: 显示驱动.音频.照相机.蓝牙.Wi-Fi驱动,电源管理等 ...
- [开发ing] Unity项目 - Hero英雄
目录 游戏原型 项目演示 绘图资源 代码实现 技术探讨 参考来源 游戏原型 游戏介绍:这是一款横版类魂游戏,玩家将操控Hero,在诸神黄昏的墓地中,挑战源源不断的敌人,以及近乎无敌的强大boss 灵感 ...
- Idea中类实现Serializable接口 引入 serialVersionUID
idea实现Serializable接口,然后打出serialVersionUID的办法 setting>editor>Inspection>Java>Serializatio ...
- docker swarm yaml
https://www.cnblogs.com/bigberg/p/8867326.html 一.简介 Docker有个编排工具docker-compose,可以将组成某个应该的多个docker容器编 ...