构造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。列的类型推断是隐式的。