SparkSQL:使用反射、编程方式将RDD转换为DataFrame

news/2024/7/7 11:22:51

为什么要将RDD转换为DataFrame?因为这样的话,我们就可以直接针对HDFS等任何可以构建为RDD的数据,使用Spark SQL进行SQL查询了。这个功能是无比强大的。想象一下,针对HDFS中的数据,直接就可以使用SQL进行查询。

一、Spark SQL支持两种方式来将RDD转换为DataFrame。

  • 第一种方式,是使用反射来推断包含了特定数据类型的RDD的元数据。这种基于反射的方式,代码比较简洁,当你已经知道你的RDD的元数据时,是一种非常不错的方式。

  • 第二种方式,是通过编程接口来创建DataFrame,你可以在程序运行时动态构建一份元数据,然后将其应用到已经存在的RDD上。这种方式的代码比较冗长,但是如果在编写程序时,还不知道RDD的元数据,只有在程序运行时,才能动态得知其元数据,那么只能通过这种动态构建元数据的方式。

二、使用反射方式推断元数据

  • Java版本:Spark SQL是支持将包含了JavaBean的RDD转换为DataFrame的。JavaBean的信息,就定义了元数据。Spark SQL现在是不支持将包含了嵌套JavaBean或者List等复杂数据的JavaBean,作为元数据的。只支持一个包含简单数据类型的field的JavaBean。

  • Scala版本:而Scala由于其具有隐式转换的特性,所以Spark SQL的Scala接口,是支持自动将包含了case class的RDD转换为DataFrame的。case class就定义了元数据。Spark SQL会通过反射读取传递给case class的参数的名称,然后将其作为列名。与Java不同的是,Spark SQL是支持将包含了嵌套数据结构的case class作为元数据的,比如包含了Array等。

三、使用编程方式指定元数据

  • Java版本:当JavaBean无法预先定义和知道的时候,比如要动态从一个文件中读取数据结构,那么就只能用编程方式动态指定元数据了。首先要从原始RDD创建一个元素为Row的RDD;其次要创建一个StructType,来代表Row;最后将动态定义的元数据应用到RDD上。

  • Scala版本:Scala的实现方式,与Java是基本一样的。


http://www.niftyadmin.cn/n/2815546.html

相关文章

Java并发53:并发集合系列-基于独占锁+PriorityBlockingQueue实现的单向阻塞无界延时队列DelayQueue

[超级链接:Java并发学习系列-绪论] [系列序章:Java并发43:并发集合系列-序章] 原文地址:http://cmsblogs.com/?p2413 DelayQueue是一个支持延时获取元素的无界阻塞队列。 里面的元素全部都是“可延期”的元素,列头的元素是最先…

批处理删除指定盘符下的某种文件

echo offecho 正在清除以lng后缀的文件,请稍后。。。 del /a /q e:\*.lng

Java并发54:并发集合系列-基于CAS算法的非阻塞无数据缓冲队列SynchronousQueue

[超级链接:Java并发学习系列-绪论] [系列序章:Java并发43:并发集合系列-序章] 原文地址:https://blog.csdn.net/Dax1n/article/details/69813682 介绍 Java 6的并发编程包中的SynchronousQueue是一个没有数据缓冲的BlockingQueue(队列只能…

一个「学渣」从零Web前端自学之路

从 13 年专科毕业开始,一路跌跌撞撞走了很多弯路,做过餐厅服务员,进过工厂干过流水线,做过客服,干过电话销售可以说经历相当的“丰富”。 最后的机缘巧合下,走上了前端开发之路,作为一个非计算机…

spring 读取properties文件--通过注解方式

问题: 需要通过properties读取页面的所需楼盘的名称.为了以后便于修改. 解决: 可以通过spring的 PropertiesFactoryBean 读取properties属性,就不需要自己通过jdk的Properties类编写程序读取信息. <!-- 第二种方式是使用注解的方式注入&#xff0c;主要用在java代码中使用注…

tomcat7.0jvm设置

点击java&#xff0c;进入&#xff0c; 加入以下代码 -XX:PermSize256M -XX:MaxPermSize512m -Xms1024m -Xmx1024m

linux 和的区别,号使用

linux中经常会用到将内容输出到某文件当中&#xff0c;只需要在执行命令后面加上>或者>>号即可进入操作。大于号&#xff1a;将一条命令执行结果&#xff08;标准输出&#xff0c;或者错误输出&#xff0c;本来都要打印到屏幕上面的&#xff09;重定向其它输出设备&am…

ORACLE导入数据库时,提示表空间不存在

昨天晚上从别人那接来一个数据库&#xff0c;让我帮他还原到他的电脑上&#xff0c;后来我就按照平时创建表空间&#xff0c;创建用户&#xff0c;导入时提示部分表提示表空间不存在&#xff0c;好悲剧&#xff0c;第一次出现这种情况&#xff0c;无奈下删除表空间&#xff0c;…