一. 引言
创建数据集的第二种方法是通过编程接口,允许您构建模式,然后将其应用于现有RDD。虽然此方法更详细,但它允许您在直到运行时才知道列及其类型时构造数据集。
DataFrame则可以通过三个步骤以编程方式创建。
1)Row从原始RDD 创建s的RDD;
2)创建由StructType匹配Row步骤1中创建的RDD中的s 结构 表示的模式。
3)Row通过createDataFrame提供的方法将模式应用于s 的RDD SparkSession。
二. 演示案例如下
import org.apache.spark.sql.types._
import org.apache.spark.sql.{Row, SparkSession}
object DataFrameRDDApp1 {
def main(args: Array[String]){
val spark = SparkSession.builder().appName("DataFrameRDDApp1").master("local[2]").getOrCreate()
val rdd = spark.sparkContext.textFile("infos.txt")
val rddDF = rdd.map(_.split(",")).map(line => Row(line(0).toInt,line(1),line(2).toInt))
val structType = StructType(Array(StructField("id",IntegerType,true),
StructField("name",StringType,true),
StructField("age",IntegerType,true)))
val infoDF = spark.createDataFrame(rddDF,structType)
infoDF.printSchema()
infoDF.show()
spark.close()
}
}
三.示例结果
四.总结
DataFrame和RDD互操作两种方式的对比:
- 1)反射: 要有case class 前提是需要知道你的字段,字段类型
- 2)Row: 如果第一种情况不能满足需求(事先不知道列)
- 3)选型:优先考虑第一种反射比较方便
详细资料参考 DataFrame与RDD互操作之编程