PySpark学习笔记(3)——DataFrame基本操作

DataFrame是一种分布在集群节点中的不可变的分布式数据集,这种数据集是以RDD为基础的,其被组织成指定的列,类似于关系数据库的二维表格和Python中的Pandas.DataFrame。DataFrame本身带有Schema元信息,即DataFrame所表示的二维表数据集的每一列都带有名称和类型。DataFrame的一个主要优点是:Spark引擎一开始就构建了一个逻辑执行计划,而且执行生成的代码是基于成本优化程序确定的物理计划,DataFrame的引入能够显著提高PySpark中的查询速度

本文主要结合一些简单的案例介绍下DataFrame的基本操作。

1.创建一个简单的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()

输出结果如下所示:


2.DataFrame基本操作

2.1 RDD的交互操作

从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输出的字段类型如下所示:

扫描二维码关注公众号,回复: 3789692 查看本文章


2.2 DataFrame API查询

类似于RDD,在DataFrame中也可以通过 .count().filter().show().take()等来查询DataFrame中的数据。示例代码如下所示:
#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()

输出结果如下所示:


2.3 SQL查询

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()

输出结果如下所示:





猜你喜欢

转载自blog.csdn.net/FlySky1991/article/details/79569846