05-快速理解SparkSQL的DataSet

打印 上一主题 下一主题

主题 852|帖子 852|积分 2556

1 定义

一个数据集是分布式的数据聚集。Spark 1.6增加新接口Dataset,提供

  • RDD的优点:强类型、能够利用强盛lambda函数
  • Spark SQL优化执行引擎的优点
可从JVM对象构造Dataset,然后函数式转换(map、flatMap、filter等)操纵。Dataset API在Scala和Java中可用。
Python不支持Dataset API,但由于Python动态性子,许多Dataset API优点已经能利用(可通过名称天然访问行的字段row.columnName)。R的情况类似。
Python支持DataFrame API是因为DataFrame API是基于Python#Pandas库构建,而Pandas库提供强盛易用的数据分析工具集。因此,Spark提供对Pandas DataFrame对象的支持,使Python利用DataFrame API非常方便。Python的Pandas也提供强类型保证,使Spark可在保持动态特性同时提供类型查抄和类型推断。因此,虽Python不支持Spark的Dataset API,但它支持Spark的DataFrame API,这为Python用户提供一种方便的数据处置惩罚方式。
2 案例
  1. package com.javaedge.bigdata.cp04
  2. import org.apache.spark.sql.{DataFrame, Dataset, SparkSession}
  3. object DatasetApp {
  4.   def main(args: Array[String]): Unit = {
  5.     val projectRootPath = "/Users/javaedge/Downloads/soft/sparksql-train"
  6.     val spark = SparkSession.builder()
  7.       .master("local").appName("DatasetApp")
  8.       .getOrCreate()
  9.     import spark.implicits._
  10.     // 创建一个包含一条记录的Seq,这条记录包含一个名为 "JavaEdge" 年龄为 18 的人员信息
  11.     val ds: Dataset[Person] = Seq(Person("JavaEdge", "18"))
  12.       // 将Seq转换为一个Dataset[Person]类型数据集,该数据集只包含一条记录
  13.       .toDS()
  14.     ds.show()
  15.     val primitiveDS: Dataset[Int] = Seq(1, 2, 3).toDS()
  16.     primitiveDS.map(x => x + 1).collect().foreach(println)
  17.     val peopleDF: DataFrame = spark.read.json(projectRootPath + "/data/people.json")
  18.     val peopleDS: Dataset[Person] = peopleDF.as[Person]
  19.     peopleDS.show(false)
  20.     peopleDF.select("name").show()
  21.     peopleDS.map(x => x.name).show()
  22.     spark.stop()
  23.   }
  24.   /**
  25.    * 自定义的 case class,其中包含两个属性
  26.    */
  27.   private case class Person(name: String, age: String)
  28. }
  29. output:
  30. +--------+---+
  31. |    name|age|
  32. +--------+---+
  33. |JavaEdge| 18|
  34. +--------+---+
  35. 2
  36. 3
  37. 4
  38. +----+-------+
  39. |age |name   |
  40. +----+-------+
  41. |null|Michael|
  42. |30  |Andy   |
  43. |19  |Justin |
  44. +----+-------+
  45. +-------+
  46. |   name|
  47. +-------+
  48. |Michael|
  49. |   Andy|
  50. | Justin|
  51. +-------+
  52. +-------+
  53. |  value|
  54. +-------+
  55. |Michael|
  56. |   Andy|
  57. | Justin|
  58. +-------+
复制代码
3 DataFrame V.S Dataset
  1. val peopleDF: DataFrame = spark.read.json(projectRootPath + "/data/people.json")
  2. val peopleDS: Dataset[Person] = peopleDF.as[Person]
  3. peopleDS.show(false)
复制代码
  1. // 弱语言类型,运行时才报错
  2. peopleDF.select("nameEdge").show()
复制代码

编译期报错:

关注我,紧跟本系列专栏文章,咱们下篇再续!
作者简介:魔都技能专家兼架构,多家大厂后端一线研发履历,各大技能社区头部专家博主。具有丰富的引领团队履历,深厚业务架构和解决方案的积累。
负责:

  • 中央/分销预订体系性能优化
  • 运动&优惠券等营销中台建设
  • 交易平台及数据中台等架构和开发计划
  • 车联网核心平台-物联网连接平台、大数据平台架构计划及优化
现在主攻降低软件复杂性计划、构建高可用体系方向。
参考:
本文由博客一文多发平台 OpenWrite 发布!

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

小小小幸运

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表