Spark SQL(四)之DataSet与RDD转换
一、创建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 。
Row
从原始RDD创建一个的RDD;- 在第1步中创建的RDD中创建
StructType
与Row
s的结构匹配 表示的模式。 Row
通过通过createDataFrame
提供的方法将架构应用于的RDDSparkSession
。
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转换相关推荐
- Apache Spark 3.0 SQL DataFrame和DataSet指南
目录 简介 SQL 数据集和数据框 入门 起点:SparkSession Scala语言 Java语言 Python语言 R语言 创建DataFrame Scala语言 Java语言 Python语言 ...
- Spark SQL之RDD转DataFrame
准备文件 首先准备好测试文件info.txt,内容如下: 1,vincent,20 2,sarah,19 3,sofia,29 4,monica,26 将RDD转成DataFrame 方式一:反射 可 ...
- Spark SQL应用解析
一 Spark SQL概述 1.1 什么是Spark SQL Spark SQL是Spark用来处理结构化数据的一个模块,它提供了一个编程抽象叫做DataFrame并且作为分布式SQL查询引擎的作用 ...
- Spark SQL玩起来
标签(空格分隔): Spark [toc] 前言 Spark SQL的介绍只包含官方文档的Getting Started.DataSource.Performance Tuning和Distribut ...
- spark sql 本地调试_干货 | 如何成为大数据Spark高手
Spark是发源于美国加州大学伯克利分校AMPLab的集群计算平台,它立足于内存计算,性能超过Hadoop百倍,从多迭代批量处理出发,兼收并蓄数据仓库.流处理和图计算等多种计算范式,是罕见的全能选手. ...
- Spark SQL: Relational Data Processing in Spark
Spark SQL: Relational Data Processing in Spark Spark SQL : Spark中关系型处理模块 说明: 类似这样的说明并非是原作者的内容翻译,而是本篇 ...
- Spark SQL中的DataFrame
在2014年7月1日的 Spark Summit 上,Databricks 宣布终止对 Shark 的开发,将重点放到 Spark SQL 上.在会议上,Databricks 表示,Shark 更多是 ...
- 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 ...
- spark sql定义RDD、DataFrame与DataSet
RDD 优点: 编译时类型安全 编译时就能检查出类型错误 面向对象的编程风格 直接通过类名点的方式来操作数据 缺点: 序列化和反序列化的性能开销 无论是集群间的通信, 还是IO操作都需要对对象的结构和 ...
最新文章
- 2022-2028年中国车载天线行业市场前瞻与投资战略规划分析报告
- MyEclipse断点调试
- springboot集成redis配置多数据源
- 微信小程序获取用户手机号--官方示例
- rabbit以及php amqp扩展使用
- 漫画:什么是人工智能
- vue webapp滑动事件_js_监听移动端web触屏事件_滑动响应
- php中dump是什么文件怎么打开,Win8/Win10 dump文件怎么打开?dump文件分析工具下载及使用教程...
- Filezilla client站点出现中文乱码的解决办法
- 蓝桥杯--算法提高 字符串跳步
- Android应用开发-小巫CSDN博客客户端总结篇
- OA项目之Mybatis多表链接查询
- 如果你打算看完Linux内核源码,可能穷尽一生都做不出一个系统
- matlab cdfx,在 Simulink 中使用 ASAM CDFX 数据
- 8个微信实用技巧,你知道多少?
- Cohort analysis
- 飞书机器人python获取open_id对应的用户信息api调用
- dataframe如何定义列名称
- c语言expand函数,编撰expand(s1,s2)
- 「聚变」前端 客户端 | 第十七届 D2 终端技术大会,开放报名!
热门文章
- 网络被屏蔽了怎么办_预埋的网线不够长,怎么办?
- facade java_Java设计模式之Facade模式
- java xml 追加,java – 如何将节点从xml文档追加到现有的xml文档
- mycli mysql_MyCLI :易于使用的 MySQL/MariaDB 客户端
- vector的求和用法accumulate
- [PAT乙级]1036 跟奥巴马一起编程
- [Qt入门]消息对话框创建
- 八数码问题II-bfs和map标记
- P4239 任意模数多项式乘法逆(多项式/ MTT)
- Fight against involution