Spark SQL 支持两种不同的方法将现有 RDD 转换为 Datasets。
第一种方法使用反射来推断包含特定类型对象的 RDD 的 schema。当你在编写 Spark 应用程序时,你已经知道了 schema,这种基于反射的方法会使代码更简洁,并且运行良好。
第二种方法是通过编程接口来创建 DataSet,这种方法允许构建一个 schema,并将其应用到现有的 RDD 上。虽然这种方法更详细,但直到运行时才知道列及其类型,才能构造 DataSets。
1. 使用反射推导schema
Spark SQL 支持自动将 JavaBeans 的 RDD 转换为 DataFrame。使用反射获取的 BeanInfo 定义了表的 schema。目前为止,Spark SQL 还不支持包含 Map 字段的 JavaBean。但是支持嵌套的 JavaBeans,List 以及 Array 字段。你可以通过创建一个实现 Serializable 的类并为其所有字段设置 getter 和 setter 方法来创建一个 JavaBean。
Java版本:
Scala版本:
2. 使用编程方式指定Schema
当 JavaBean 类不能提前定义时(例如,记录的结构以字符串编码,或者解析文本数据集,不同用户字段映射方式不同),可以通过编程方式创建 DataSet,有如下三个步骤:
从原始 RDD(例如,JavaRDD
)创建 Rows 的 RDD(JavaRDD);
创建由 StructType 表示的 schema,与步骤1中创建的 RDD 中的 Rows 结构相匹配。
通过SparkSession提供的 createDataFrame 方法将 schema 应用到 Rows 的 RDD。
Java版本:
Scala版本:
Spark 版本: 2.3.1
领取专属 10元无门槛券
私享最新 技术干货