楔子
spark sql,显然就是让我们像写sql一样去编写spark程序。但是spark它并不仅仅是sql,sql只是spark提供的功能之一,而且还支持DataFrame。想想hive,它们存在的意义都是类似的。因为熟悉sql的人是很多的,如果一款框架能够让你像sql一样去编写程序,那么它一定是灰常受欢迎的,就类似于当初的hive一样,hive刚出来的时候也特别火。多余的不多说了,我们来看看如何使用python来操作spark的sql组件。
python操作spark sql基础
SparkSession
正如我们想要操作RDD一样,我们需要有一个SparkContext对象,那么这里也是类似的,需要一个SparkSession对象。而我们说启动pyspark shell的时候,默认给我们创建一个SparkContext对象:sc,同理也创建了一个SparkSession对象:spark。如果我们手动创建的话,可以这么创建。
from pyspark.sql import SparkSession
spark = SparkSession().builder.appName("name").config("spark.some.config.option", "some-value").getOrCreate()
创建一个DataFrame
SparkSession对象可以将一个已存在的RDD、hive表、其它的数据源转成DataFrame,比如我们将一个json文件变成DataFrame。
>>> # spark是默认的SparkSession对象,调用其内部的.read.json方法读取数据即可得到DataFrame
>>> df = spark.read.json("file:///root/girl.json")
>>> # 调用show方法展示数据
>>> df.show()
+---+------+--------+
|age|gender| name|
+---+------+--------+
| 17|female|古明地觉|
|400|female|四方茉莉|
| 18|female|椎名真白|
+---+------+--------+
>>>
DataFrame常规操作
>>> # 查看schema
>>> df.printSchema()
root
|-- age: long (nullable = true)
|-- gender: string (nullable = true)
|-- name: string (nullable = true)
>>> # 选择某一列
>>> df.select("name").show()
+--------+
| name|
+--------+
|古明地觉|
|四方茉莉|
|椎名真白|
+--------+
>>> # 还可以通过df来指定
>>> df.select(df["age"], df.age).show()
+---+---+
|age|age|
+---+---+
| 17| 17|
|400|400|
| 18| 18|
+---+---+
>>> # 如果带运算的话,那么必须加上df
>>> df.select(df["age"] + 1).show()
+---------+
|(age + 1)|
+---------+
| 18|
| 401|
| 19|
+---------+
>>> # 条件筛选
>>> df.filter(df["age"]>17).show()
+---+------+--------+
|age|gender| name|
+---+------+--------+
|400|female|四方茉莉|
| 18|female|椎名真白|
+---+------+--------+
>>> # 聚合
>>> df.groupBy("age").count().show()
+---+-----+
|age|count|
+---+-----+
| 17| 1|
|400| 1|
| 18| 1|
+---+-----+
将DataFrame注册成一张局部视图
>>> # 将df注册成一张临时视图,名叫girl
>>> df.createOrReplaceTempView("girl")
>>> # 执行查询语句
>>> sql_df = spark.sql("select * from girl")
>>> # 显示
>>> sql_df.show()
+---+------+--------+
|age|gender| name|
+---+------+--------+
| 17|female|古明地觉|
|400|female|四方茉莉|
| 18|female|椎名真白|
+---+------+--------+
将DataFrame注册成一张全局视图
>>> # 注册成全局视图
>>> df.createGlobalTempView("girl")
>>> # 访问的时候要通过global_temp.来访问
>>> spark.sql("select * from global_temp.girl").show()
+---+------+--------+
|age|gender| name|
+---+------+--------+
| 17|female|古明地觉|
|400|female|四方茉莉|
| 18|female|椎名真白|
+---+------+--------+