简介
DataFrame结构代表的是数据的一个不可变分布式集合,其数据都被组织到有名字的列中,就像关系型数据库中的表一样。DataFrame 的目的就是要让对大型数据集的处理变得更简单,它让开发者可以为分布式的数据集指定一个模式,进行更高层次的抽象。
本文将着重介绍PySpark中DataFrame的各种创建方式,以及与RDD、Pandas之间的转换。
DataFrame的创建
1. 从RDD中创建
为了从存在的RDD结构中创建出DataFrame,我们先定义一些测试数据,如下:
data = [("Java", "20000"), ("Python", "100000"), ("Scala", "3000")] #list中的每一个元素都是元祖
接着先创建一个SparkSession,并通过调用SparkContext的parallelize()函数构造出一个RDD对象,代码如下:
import pyspark
from pyspark.sql import SparkSession, Row
from pyspark.sql.types import StructType,StructField, StringType, IntegerType
spark = SparkSession.builder.appName('SparkByExamples.com').getOrCreate()
rdd = spark.sparkContext.parallelize(data)
1.1 使用toDF()函数
RDD的toDF()方法是用来从一个存在的RDD结构中创建一个DataFrame对象,因为RDD是一个分布式的 Java对象的集合,故它没有包含列的信息,因此DataFrame采用的是默认的列。上面列举的测试数据一共有2列,分别用"_1"和“_2”来表示。
dfFromRDD1 = rdd.toDF()
dfFromRDD1.printSchema()
printSchema函数用于输出DataFrame的结构,即包含了哪些列,以及每一列的名称和类型等等,输出如下:
如果想给DataFrame中的每一列指定名称的话,我们可以在toDF函数中传入列的名称,如下:
columns = ["language","users_count"]
dfFromRDD1 = rdd.toDF(columns)
dfFromRDD1.printSchema()
这样输出DataFrame的结构信息的时候,就会包含列名称以及类型了,如下: