DataFrame是一种分布在集群节点中的不可变的分布式数据集,这种数据集是以RDD为基础的,其被组织成指定的列,类似于关系数据库的二维表格和Python中的Pandas.DataFrame。DataFrame本身带有Schema元信息,即DataFrame所表示的二维表数据集的每一列都带有名称和类型。DataFrame的一个主要优点是:Spark引擎一开始就构建了一个逻辑执行计划,而且执行生成的代码是基于成本优化程序确定的物理计划,DataFrame的引入能够显著提高PySpark中的查询速度。
本文主要结合一些简单的案例介绍下DataFrame的基本操作。
完整的示例代码如下所示:
%pyspark
#生成一段JSON数据
stringJSONRDD = sc.parallelize(("""
{"id":"123",
"name":"Katie",
"age":19,
"eyeColor":"brown"
}""",
"""{
"id":"456",
"name":"Michael",
"age":21,
"eyeColor":"blue"
}""",
"""{
"id":"789",
"name":"Jack",
"age":23,
"eyeColor":"Black"
}"""))
#创建一个DataFrame
swimmersJSON = spark.read.json(stringJSONRDD)
#1.输出DataFrame中的元素
print("1.输出DataFrame中的元素:\n")
swimmersJSON.show()
#2.输出DataFrame的Schema模式(名称和类型)
print("2.输出DataFrame的Schema模式(名称和类型):\n")
swimmersJSON.printSchema()
输出结果如下所示:
从RDD变换到DataFrame主要有两种不同的方法:使用反射推断模式和以编程方式指定模式。
(1)使用反射推断模式
在创建DataFrame时,如果没有指定模式,就会使用printSchema()方法自带的模式定义。上一小节的DataFrame示例就是通过这种方法创建的。这种方法能够更为简便的创建DataFrame,但不能精细地控制DataFrame的模式。
(2)以编程方式指定模式
和前一种方法相比,以编程方式指定DataFrame模式虽然更为麻烦一些,但能够精细地控制DataFrame的模式。示例代码如下所示:
%pyspark
#导入类型
from pyspark.sql.types import *
#生成以逗号分隔的数据
stringCSVRDD = sc.parallelize([
(123,'Katie',19,'brown'),
(345,'Michael',20,'green'),
(567,'Simone',21,'blue')])
#指定模式
schema = StructType([
StructField("id",LongType(),True),
StructField("name",StringType(),True),
StructField("age",LongType(),True),
StructField("eyeColor",StringType(),True),])
#对RDD应用该模式并且创建DataFrame
swimmers = spark.createDataFrame(stringCSVRDD,schema)
#利用DataFrame创建一个临时视图
swimmers.createOrReplaceTempView("swimmers")
#输出DataFrame中每个字段的类型
print("输出DataFrame中每个字段的类型:\n")
swimmers.printSchema()
通过printSchema输出的字段类型如下所示:
#1.输出DataFrame中的行数
print("1.输出DataFrame中的行数:\n{}".format(swimmers.count()))
#2.用filter获取age=20的id
print("2.输出DataFrame中age=20的id:\n")
swimmers.select("id","age").filter("age=20").show()
#3.获取eyeColor like 'b%'的id,name,eyeColor
print("3.输出DataFrame中eyeColor like 'b%'的id,name,eyeColor:\n")
swimmers.select("id","name","age").filter("eyeColor like 'b%'").show()
输出结果如下所示:
SQL查询DataFrame数据的示例代码如下所示:
#1.获取DataFrame中数据的行数
print("1.利用SQL查询输出DataFrame中数据的行数:\n")
spark.sql("select count(1) as num from swimmers").show()
#2.利用where子句获取age=21的id,age
print("2.利用where子句获取age=21的id,age:\n")
spark.sql("select id,age from swimmers where age = 21").show()
#3.利用where子句获取DataFrame中eyeColor like 'b%'的所有字段信息
print("3.利用where子句获取DataFrame中eyeColor like 'b%'的所有字段信息:\n")
spark.sql("select * from swimmers where eyeColor like 'b%'").show()
输出结果如下所示: