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对象的集 ...
随机推荐
- 1.2.1LVM逻辑卷镜像实现方法
LVM逻辑卷镜像实现方法 本文演示了在CentOS5系统中实现LVM逻辑卷镜像的方法.LVM的镜像功能,有点儿类似于Raid1,即多块儿磁盘互相同步,确保资料不会丢失. 创建物理卷,卷组的步骤这里就先 ...
- NFS挂载参数
mount -t nfs -o rw,bg,hard,nointr,rsize=32768,wsize=32768,tcp,actimeo=0,vers=3,timeo=6 192.168.12.50 ...
- python鸭子类型
“当看到一只鸟走起来像鸭子.游泳起来像鸭子.叫起来也像鸭子,那么这只鸟就能够被称为鸭子” python的鸭子类型的设计让python的诸多对象的分类和应用更加灵活,需要注意类型和对象的区别(pytho ...
- lsb_release -a linux查看版本未找到命令
解决方案 yum install -y redhat-lsb 安装完后
- WPF 的命令的自动刷新时机——当你 CanExecute 会返回 true 但命令依旧不可用时可能是这些原因
原文:WPF 的命令的自动刷新时机--当你 CanExecute 会返回 true 但命令依旧不可用时可能是这些原因 在 WPF 中,你可以使用 Command="{Binding Walt ...
- 在windows服务中使用定时器
在windows服务中,利用winform中直接拖动timer控件的方式使用定时器是不可以的,启动服务后会发现定时器并没有执行.那么在windows服务中如何使用定时器呢? 不使用直接拖动控件的方式 ...
- MVC Filter的使用方法
相信对权限过滤大家伙都不陌生 用户要访问一个页面时 先对其权限进行判断并进行相应的处理动作 在webform中 最直接也是最原始的办法就是 在page_load事件中所有代码之前 先执行一个权限判断的 ...
- 2019 58同城java面试笔试题 (含面试题解析)
本人3年开发经验.18年年底开始跑路找工作,在互联网寒冬下成功拿到阿里巴巴.今日头条.58同城等公司offer,岗位是Java后端开发,最终选择去了58同城. 面试了很多家公司,感觉大部分公司考察的点 ...
- Java自学-数组 Arrays
java.util.Arrays类常用方法 Arrays是针对数组的工具类,可以进行 排序,查找,复制填充等功能. 大大提高了开发人员的工作效率. 步骤 1 : 数组复制 与使用System.arra ...
- Jquery 跨Dom窗口操作
. 子窗口给父窗口元素赋值 function modifyTheme(id){ $("#parent_dom",window.parent.document).attr(" ...