一、创建DataSet

DataSet与RDD相似,但是,它们不使用Java序列化或Kryo,而是使用专用的Encoder对对象进行序列化以进行网络处理或传输。虽然编码器和标准序列化都负责将对象转换为字节,但是编码器是动态生成的代码,并使用一种格式,该格式允许Spark执行许多操作,例如过滤,排序和哈希处理,而无需将字节反序列化回对象。

Encoder<Man> manEncoder = Encoders.bean(Man.class);
Dataset<Man> manDS = spark.createDataset(Collections.singletonList(man),manEncoder
);Encoder<String> strEncoder = Encoders.STRING();
Dataset<String> strDS = spark.createDataset(Arrays.asList("a", "b", "c"), strEncoder);

二、RDD转DataSet

Spark SQL支持两种将现有RDD转换为数据集的方法。第一种方法使用反射来推断包含特定对象类型的RDD的架构。这种基于反射的方法可以使代码更简洁,并且在编写Spark应用程序时已经了解架构时可以很好地工作。

创建数据集的第二种方法是通过编程界面,该界面允许您构造模式,然后将其应用于现有的RDD。尽管此方法较为冗长,但可以在运行时才知道列及其类型的情况下构造数据集。

(1)使用反射推断表的模式

Spark SQL支持自动将JavaBean的RDD 转换为DataFrame,使用反射得到Bean信息,定义了表的模式。Spark SQL不支持包含Map字段的JavaBean 。 不过,支持嵌套JavaBean和List或Array字段。

可以通过创建一个实现Serializable并为其所有字段具有getter和setter的类来创建JavaBean。

JavaRDD<Man> manRDD = spark.read().textFile("/test.txt").javaRDD().map(line -> {String[] splits = line.split(",");Man man = new Man();man.setName(splits[0]);man.setDesc(splits[1]);return man;});Dataset<Row> manDF = spark.createDataFrame(manRDD, Man.class);

(2)以编程方式指定架构

当无法提前定义JavaBean类时(例如,记录的结构编码为字符串,或者将解析文本数据集,并且为不同的用户设计不同的字段),Dataset<Row>可以通过三个步骤以编程方式创建a 。

  1. Row从原始RDD创建一个的RDD;
  2. 在第1步中创建的RDD中创建StructTypeRows的结构匹配 表示的模式。
  3. Row通过通过createDataFrame提供的方法将架构应用于的RDD SparkSession
JavaRDD<String> manRDD = ...
String cols = "name,desc";
List<StructField> fields = new LinkedList<>();
for (String fieldName : cols.split(",")) {StructField field = DataTypes.createStructField(fieldName, DataTypes.StringType, true);fields.add(field);
}
StructType schema = DataTypes.createStructType(fields);
JavaRDD<Row> rowRDD = manRDD.map((Function<String, Row>) record -> {String[] splits = record.split(",");return RowFactory.create(splits[0], splits[1].trim());
});Dataset<Row> manDataFrame = spark.createDataFrame(rowRDD, schema);

三、DataSet转RDD

toJavaRDD方法直接将DataSet转RDD

JavaRDD<Row> javaRDD = df.toJavaRDD();

Spark SQL(四)之DataSet与RDD转换相关推荐

  1. Apache Spark 3.0 SQL DataFrame和DataSet指南

    目录 简介 SQL 数据集和数据框 入门 起点:SparkSession Scala语言 Java语言 Python语言 R语言 创建DataFrame Scala语言 Java语言 Python语言 ...

  2. Spark SQL之RDD转DataFrame

    准备文件 首先准备好测试文件info.txt,内容如下: 1,vincent,20 2,sarah,19 3,sofia,29 4,monica,26 将RDD转成DataFrame 方式一:反射 可 ...

  3. Spark SQL应用解析

    一  Spark SQL概述 1.1 什么是Spark SQL Spark SQL是Spark用来处理结构化数据的一个模块,它提供了一个编程抽象叫做DataFrame并且作为分布式SQL查询引擎的作用 ...

  4. Spark SQL玩起来

    标签(空格分隔): Spark [toc] 前言 Spark SQL的介绍只包含官方文档的Getting Started.DataSource.Performance Tuning和Distribut ...

  5. spark sql 本地调试_干货 | 如何成为大数据Spark高手

    Spark是发源于美国加州大学伯克利分校AMPLab的集群计算平台,它立足于内存计算,性能超过Hadoop百倍,从多迭代批量处理出发,兼收并蓄数据仓库.流处理和图计算等多种计算范式,是罕见的全能选手. ...

  6. Spark SQL: Relational Data Processing in Spark

    Spark SQL: Relational Data Processing in Spark Spark SQL : Spark中关系型处理模块 说明: 类似这样的说明并非是原作者的内容翻译,而是本篇 ...

  7. Spark SQL中的DataFrame

    在2014年7月1日的 Spark Summit 上,Databricks 宣布终止对 Shark 的开发,将重点放到 Spark SQL 上.在会议上,Databricks 表示,Shark 更多是 ...

  8. spark sql 1.2.0 测试

    1:启动shell master=spark://feng02:7077 ./bin/spark-shell [jifeng@feng02 spark-1.2.0-bin-2.4.1]$ master ...

  9. spark sql定义RDD、DataFrame与DataSet

    RDD 优点: 编译时类型安全 编译时就能检查出类型错误 面向对象的编程风格 直接通过类名点的方式来操作数据 缺点: 序列化和反序列化的性能开销 无论是集群间的通信, 还是IO操作都需要对对象的结构和 ...

最新文章

  1. 2022-2028年中国车载天线行业市场前瞻与投资战略规划分析报告
  2. MyEclipse断点调试
  3. springboot集成redis配置多数据源
  4. 微信小程序获取用户手机号--官方示例
  5. rabbit以及php amqp扩展使用
  6. 漫画:什么是人工智能
  7. vue webapp滑动事件_js_监听移动端web触屏事件_滑动响应
  8. php中dump是什么文件怎么打开,Win8/Win10 dump文件怎么打开?dump文件分析工具下载及使用教程...
  9. Filezilla client站点出现中文乱码的解决办法
  10. 蓝桥杯--算法提高 字符串跳步
  11. Android应用开发-小巫CSDN博客客户端总结篇
  12. OA项目之Mybatis多表链接查询
  13. 如果你打算看完Linux内核源码,可能穷尽一生都做不出一个系统
  14. matlab cdfx,在 Simulink 中使用 ASAM CDFX 数据
  15. 8个微信实用技巧,你知道多少?
  16. Cohort analysis
  17. 飞书机器人python获取open_id对应的用户信息api调用
  18. dataframe如何定义列名称
  19. c语言expand函数,编撰expand(s1,s2)
  20. 「聚变」前端 客户端 | 第十七届 D2 终端技术大会,开放报名!

热门文章

  1. 网络被屏蔽了怎么办_预埋的网线不够长,怎么办?
  2. facade java_Java设计模式之Facade模式
  3. java xml 追加,java – 如何将节点从xml文档追加到现有的xml文档
  4. mycli mysql_MyCLI :易于使用的 MySQL/MariaDB 客户端
  5. vector的求和用法accumulate
  6. [PAT乙级]1036 跟奥巴马一起编程
  7. [Qt入门]消息对话框创建
  8. 八数码问题II-bfs和map标记
  9. P4239 任意模数多项式乘法逆(多项式/ MTT)
  10. Fight against involution