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. eclipse项目有红色感叹号

    1.依赖有问题 找到build path 点击configure build path 点击libraries 找到有红叉的包,然后选中移除 2.引用的包有问题 利用maven引用的包出现问题,有的包 ...

  2. python入门之格式化输出

    目录 扩展: 保留几位小数 一.占位符格式化输出 1.1 %s 1.2 %d 二..format()方式 三.f-string 扩展: 保留几位小数 保留两位小数 a = 12345.2487 pri ...

  3. git删除本地分支,远端分支

    br为远端分支名字. 删除local分支 git branch -d 分支名

  4. JVM知识点总览-高级Java工程师面试必备

    jvm 总体梳理 jvm体系总体分四大块: 类的加载机制 jvm内存结构 GC算法 垃圾回收 GC分析 命令调优 当然这些知识点在之前的文章中都有详细的介绍,这里只做主干的梳理 这里画了一个思维导图, ...

  5. MATLAB自定义函数

    MATLAB自定义函数形式 function [a,b,c] = funname(x1,x2,x3) 输入变量 对于输入变量,MATLAB可以识别输入变量的个数,通过nargin来记录当前输入变量个数 ...

  6. SGU 128. Snake --- 暴力枚举+并查集+贪心+计算几何

    <传送门> 128. Snake time limit per test: 0.25 sec. memory limit per test: 4096 KB There are N poi ...

  7. java-工厂

    class Mouse{ public void sayHi(){}; } class DellMouse extends Mouse { @Override public void sayHi() ...

  8. Python学习之路:函数传递可变参数与不可变参数

    函数传参的方法: 太基础了,8说了 直接上重点 一.可变参数的传递 可变参数有:列表.集合.字典 直接上代码: a = [1, 2] def fun(a): print('传入函数时a的值为:', a ...

  9. Docker容器挂载文件(转载)

    一.Docker pull 安装 Nginx 1.查看docker仓库中的 nginx 命令 # 使用 docker search 命令搜索存放在 Docker Hub 中的镜像 docker sea ...

  10. [洛谷P4385][COCI2009]Dvapravca(咕咕咕)

    题目大意:很早以前做的题 题解: 卡点: C++ Code: #pragma GCC optimize("Ofast") #pragma GCC optimize("un ...