PySpark|比RDD更快的DataFrame

DataFrame介绍

DataFrame是一种不可变的分布式数据集,这种数据集被组织成指定的列,类似于关系数据库中的表。如果你了解过pandas中的DataFrame,千万不要把二者混为一谈,二者从工作方式到内存缓存都是不同的。

DataFrame的作用

对于Spark来说,引入DataFrame之前,Python的查询速度普遍比使用RDD的Scala查询慢(Scala要慢两倍),通常情况下这种速度的差异来源于Python和JVM之间的通信开销。具体的时间差异如下图所示:

由上图可以看到,使用了DataFrame(DF)之后,Python的性能得到了很大的改进,对于SQL、R、Scala等语言的性能也会有很大的提升。

创建DataFrame

上一篇中我们了解了如何创建RDD,在创建DataFrame的时候,我们可以直接基于RDD进行转换。示例操作如下

  • spark.read.json()

生成RDD:

stringJSONRDD = sc.parallelize((""" 
  { "id": "123",
    "name": "Katie",
    "age": 19,
    "eyeColor": "brown"
  }""",
   """{
    "id": "234",
    "name": "Michael",
    "age": 22,
    "eyeColor": "green"
  }""", 
  """{
    "id": "345",
    "name": "Simone",
    "age": 23,
    "eyeColor": "blue"
  }""")
)

转换成DataFrame:

swimmersJSON = spark.read.json(stringJSONRDD)
  • createOrReplaceTempView()

我们可以使用该函数进行临时表的创建。

swimmersJSON.createOrReplaceTempView("swimmersJSON")

DataFrame查询

​我们可以使用DataFrame的API或者使用DataFrame的SQL查询。

  • show()

使用show(n)方法,可以把前n行打印到控制台上(默认显示前十行)。

swimmersJSON.show()
  • collect

使用collect可以返回行对象列表的所有记录。

swimmersJSON.collect()
  • SQL查询

我们可以通过写SQL语句的形式对表格进行查询。

spark.sql("select * from swimmersJSON").collect()

DF和RDD的交互操作

  • printSchema()

该方法可以用来打印出每个列的数据类型,我们称之为打印模式。

swimmersJSON.printSchema()
  • StructType()

该方法可以用于编程指定的模式。

schema = StructType([
    StructField("id", LongType(), True),    
    StructField("name", StringType(), True),
    StructField("age", LongType(), True),
    StructField("eyeColor", StringType(), True)
])

 

  • createDataFrame(XXRDD, schema)

该方法用于应用指定的schema模式并创建RDD。

swimmers = spark.createDataFrame(stringCSVRDD, schema)

利用DataFrame API进行查询

  • ​count()

用于得到DataFrame的行数。

swimmers.count()
  • 运行筛选语句

我们可以使用filter子句运行筛选语句,用select子句来指定要返回的列。

方法1:

swimmers.select("id", "age").filter("age = 22").show()

方法2:

swimmers.select("name", "eyeColor").filter("eyeColor like 'b%'").show()

总结

 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

二哥不像程序员

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值