我对DataFrame的理解(Spark)

来源:互联网 发布:人卫网络增值服务有啥 编辑:程序博客网 时间:2024/05/29 14:58

以下链接为Spark –SQL中的dataFrame API
http://spark.apache.org/docs/latest/api/scala/index.html#org.apache.spark.sql.DataFrame
dataframe 官方说明:
http://spark.apache.org/docs/latest/sql-programming-guide.html
参考文档:http://ju.outofmemory.cn/entry/128891
在Spark中,DataFrame是一个以命名列方式组织的分布式数据集,等同于关系型数据库中的一个表,也相当于R/Python中的data frames(但是进行了更多的优化)。DataFrames可以由结构化数据文件转换而来,也可以从Hive中的表得来,以及可以转换自外部数据库或现有的RDD。

类似于RDD,DataFrame同样使用了lazy的方式。也就是说,只有动作真正发生时(如显示结果,保存输出),计算才会进行。从而,通过一些技术,比如predicate push-downs和bytecode generation,执行过程可以进行适当的优化。同时,所有的DataFrames也会自动的在集群上并行和分布执行。

官方给出了详细的API可以给我们调用,下面用scala为例,简单地说明:

1.在Spark SQL中所有函数的入口点都是一个SQLContext类,或者是它的子类,要创建一个SQLContext,那么首先应该创建一个SparkContext的对象

val sc: SparkContext //已经存在的 SparkContext.(没有的话,要自己重建)
val sqlContext = new org.apache.spark.sql.SQLContext(sc)
// 这个包可以将RDD转换成DataFrame
import sqlContext.implicits._

除了一个基本的 SQLContext,你也能够创建一个 HiveContext,它支持基本 SQLContext 所支持功能的一个超集。它的额外的功能包括用更完整的 HiveQL 分析器写查询去访问 HiveUDFs 的能力、 从 Hive 表读取数据的能力。用 HiveContext 你不需要一个已经存在的 Hive 开启,SQLContext 可用的数据源对 HiveContext 也可用。HiveContext 分开打包是为了避免在 Spark 构建时包含了所有 的 Hive 依赖。如果对你的应用程序来说,这些依赖不存在问题,Spark 1.3 推荐使用 HiveContext。以后的稳定版本将专注于为 SQLContext 提供与 HiveContext 等价的功能。用来解析查询语句的特定 SQL 变种语言可以通过 spark.sql.dialect 选项来选择。这个参数可以通过两种方式改变,一种方式是通过 setConf 方法设定,另一种方式是在 SQL 命令中通过 SET key=value 来设定。对于 SQLContext,唯一可用的方言是 “sql”,它是 Spark SQL 提供的一个简单的 SQL 解析器。在 HiveContext 中,虽然也支持"sql",但默认的方言是 “hiveql”,这是因为 HiveQL 解析器更完整。

一.从文件创建DataFrame

1.DataFrame的一些操作

2.以编程模式运行SQL查询
应用可以通过SQLContext的sql操作进行查询操作,该方法返回的结果是一个DataFrame,举例如下:

二。把RDDS转换成dataFrame
Spark SQL 支持两种方法将存在的 RDD 转换为 DataFrame 。第一种方法使用反射来推断包含特定对象类型的 RDD 的模式。在你写 spark 程序的同时,当你已经知道了模式,这种基于反射的方法可以使代码更简洁并且程序工作得更好。
第二种方法是通过一个编程接口来实现,这个接口允许你构造一个模式,然后在存在的 RDD 上使用它。虽然这种方法更冗长,但是它允许你在运行期之前不知道列以及列的类型的情况下构造 DataFrame。
用反射来推断模式:
Spark SQL的 Scala 接口支持将包含样本类的 RDD 自动转换为 DataFrame。这个样本类定义了表的模式。样本类的参数名字通过反射来读取,然后作为列的名字。样本类可以嵌套或者包含复杂的类型如序列或者数组。这个 RDD 可以隐式转化为一个 DataFrame,然后注册为一个表,表可以在后续的 sql 语句中使用。

具体源码地址:http://spark.apache.org/docs/latest/sql-programming-guide.html
编程指定模式
当样本类不能提前确定(例如,记录的结构是经过编码的字符串,或者一个文本集合将会被解析,不同的字段投影给不同的用户),一个 DataFrame 可以通过三步来创建。
• 从原来的 RDD 创建一个行的 RDD
• 创建由一个 StructType 表示的模式与第一步创建的 RDD 的行结构相匹配
• 在行 RDD 上通过 applySchema 方法应用模式
具体源码地址:http://spark.apache.org/docs/latest/sql-programming-guide.html

0 0