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的更多相关文章

  1. RDD/Dataset/DataFrame互转

    1.RDD -> Dataset val ds = rdd.toDS() 2.RDD -> DataFrame val df = spark.read.json(rdd) 3.Datase ...

  2. Spark提高篇——RDD/DataSet/DataFrame(一)

    该部分分为两篇,分别介绍RDD与Dataset/DataFrame: 一.RDD 二.DataSet/DataFrame 先来看下官网对RDD.DataSet.DataFrame的解释: 1.RDD ...

  3. Spark提高篇——RDD/DataSet/DataFrame(二)

    该部分分为两篇,分别介绍RDD与Dataset/DataFrame: 一.RDD 二.DataSet/DataFrame 该篇主要介绍DataSet与DataFrame. 一.生成DataFrame ...

  4. RDD、DataFrame和DataSet的区别

    原文链接:http://www.jianshu.com/p/c0181667daa0 RDD.DataFrame和DataSet是容易产生混淆的概念,必须对其相互之间对比,才可以知道其中异同. RDD ...

  5. 谈谈RDD、DataFrame、Dataset的区别和各自的优势

    在spark中,RDD.DataFrame.Dataset是最常用的数据类型,本博文给出笔者在使用的过程中体会到的区别和各自的优势 共性: 1.RDD.DataFrame.Dataset全都是spar ...

  6. spark RDD,DataFrame,DataSet 介绍

    弹性分布式数据集(Resilient Distributed Dataset,RDD) RDD是Spark一开始就提供的主要API,从根本上来说,一个RDD就是你的数据的一个不可变的分布式元素集合,在 ...

  7. RDD、DataFrame、Dataset三者三者之间转换

    转化: RDD.DataFrame.Dataset三者有许多共性,有各自适用的场景常常需要在三者之间转换 DataFrame/Dataset转RDD: 这个转换很简单 val rdd1=testDF. ...

  8. RDD、DataFrame、Dataset

    RDD是Spark建立之初的核心API.RDD是不可变分布式弹性数据集,在Spark集群中可跨节点分区,并提供分布式low-level API来操作RDD,包括transformation和actio ...

  9. RDD、DataFrame和DataSet

    简述 RDD.DataFrame和DataSet是容易产生混淆的概念,必须对其相互之间对比,才可以知道其中异同:DataFrame多了数据的结构信息,即schema.RDD是分布式的 Java对象的集 ...

随机推荐

  1. 如何理解JavaScript的原型和原型链

    在现在的业务开发中,应该很少人在写原生JavaScript了,大家都一股脑地扑在各个框架上.本来,这些框架对于业务和开发者来说是一种福音,减少了各种各样的开发痛点,但是带来的负面问题就是对于开发者来说 ...

  2. linux安装docker,并在docker上运行springboot项目

    docker架构示例图 仓库---> 镜像 --->  容器 一.安装docker 1.通过 uname -r 命令查看你当前的内核版本 uname -r 2使用 root 权限登录 Ce ...

  3. 寻找最小矩形边框--OpenCv

    好久没有写博客了 今天写一下比较常用的寻找矩形边框 ////////////////////////////寻找最矩形边框/////////////////////////////////////// ...

  4. HLP帮助文件源文件RTF文件的编写

    https://www.cnblogs.com/gaodu2003/archive/2008/12/17/1356861.html 举例说明如下: 每一节的标题在RTF文件中一般以特有的脚注($)指定 ...

  5. python 之 面向对象 (异常处理)

    7.15 异常处理 1.什么是异常 异常是错误发生的信号,程序一旦出错,如果程序中还没有相应的处理机制,那么该错误就会产生一个异常抛出来,程序的运行也随之终止 2.一个异常分为三部分: 异常的追踪信息 ...

  6. 解决clover配置文件conf.plist中nv_disable=1或者nvda_drv=1不生效或者说不能删除的问题

    情况一:U盘安装MacOS的时候conf.plist中设置了nv_disable=1,但是启动的时候任然显示nvda_drv=1. 这种情况一般出现在该机器曾经安装过MacOS,MacOS会将这个参数 ...

  7. 1 matplotlib绘制折线图

    from matplotlib import pyplot as plt #设置图形大小 plt.figure(figsize=(20,8),dpi=80) plt.plot(x,y,color=&q ...

  8. P2711 小行星 (最大流)

    题目 P2711 小行星 解析 这道题挺巧妙的,乍一看是空间上的,无从下手,稍微转换一下就可以了. 看到题目,求消除这些行星的最少次数,就是求最小割,也就是求最大流,考虑怎样建图. 考虑当我们消去一个 ...

  9. linux入门—安装linux系统(1)

    一,linux介绍 linux是一套免费使用和自由传播的类Unix操作系统,简单的说就是不要钱,你可以随便使用,也可以分享给其他人. (剩下的详细内容,个人认为百度百科的内容比我瞎讲强的多,网址:ht ...

  10. Android为TV端助力之解析序列话的JSON

    解析json时报错default constructor not found. class............. 比如 public class MediaRepBean implements P ...