构造DataFrame-简单创建方式

有多种方式可用来创建DataFrame:

  • 简单创建单列和多列DataFrame;
  • 转换已经存在的RDD;
  • 加载外部数据。

创建单列DataFrame

SparkSession有一个函数叫range,可以很容易地创建单列DataFrame,带有列名id和类型LongType。

请执行以下的代码:

// 创建单列DataFrame,默认列名是id,类型是LongType
val df0 = spark.range(5).toDF()
df0.printSchema
df0.show

输出结果如下所示:

+---+
| id|
+---+
|  0|
|  1|
|  2|
|  3|
|  4|
+---+

还可以指定列名:

val df1 = spark.range(5).toDF("num")
df1.show

输出结果如下所示:

+---+
|num|
+---+
|  0|
|  1|
|  2|
|  3|
|  4|
+---+

另外,还可以指定范围的起始(含)和结束值(不含):

val df2 = spark.range(5,10).toDF("num")
df2.show

输出结果如下所示:

+---+
|num|
+---+
|  5|
|  6|
|  7|
|  8|
|  9|
+---+

另外,还可以指定步长:

val df3 = spark.range(5,15,2).toDF("num")
df3.show

输出结果如下所示:

+---+
|num|
+---+
|  5|
|  7|
|  9|
| 11|
| 13|
+---+

请注意,toDF采用的是元组列表,而不是标量元素。

创建多列DataFrame

通过将一个元组集合转换为一个DataFrame,可创建多列DataFrame。这需要使用SparkSession对象的toDF方法。toDF方法将列标签列表作为可选的参数,以指定转换后的DataFrame的标题行。

请执行下面的代码:

// 用于隐式转换,如将rdd转换为DataFrame
import spark.implicits._

// 元组序列
val movies = Seq(("马特·达蒙", "谍影重重:极限伯恩", 2007L),
                ("马特·达蒙", "心灵捕手", 1997L))

// 将元组转为DataFrame                
val moviesDF = movies.toDF("演员", "电影", "年份")

// 输出模式
moviesDF.printSchema

// 显示
moviesDF.show

输出结果如下所示:

root
 |-- 演员: string (nullable = true)
 |-- 电影: string (nullable = true)
 |-- 年份: long (nullable = false)

+---------+-----------------+----+
|     演员|             电影|年份|
+---------+-----------------+----+
|马特·达蒙|谍影重重:极限伯恩|2007|
|马特·达蒙|         心灵捕手|1997|
+---------+-----------------+----+

通过元组来创建单列或多列DataFrame,每个元组类似于一行。可以选择标题列;否则,Spark会创建一些模糊的名称,比如_1、_2。列的类型推断是隐式的。


《Flink原理深入与编程实战》