Loading

SparkSQL指南-快速开始(Python版)——(一)

快速开始

创建环境

Spark程序主要分为三个阶段:

  • 创建环境
  • 数据操作
  • 关闭环境(在Streaming程序中为执行环境)
    下面是批处理的Spark SQL API的创建环境的类:SparkSession,其目的是为了创建基本的Spark SQL的环境。
from pyspark.sql import SparkSession
spark=SparkSession.builder\
	.appName("Spark SQL basic test")\
	.getOrCreate()

注意:一定要有“\”
其中还可以指定操作,比如连接Mongodb的操作,支持Hive的操作,具体的写法类似于如下:

from pyspark.sql import SparkSession

if __name__ == '__main__':
    spark=SparkSession.builder\
        .appName("Spark SQL basic test")\
        .config("spark.some.config.option", "some-value")\
        .getOrCreate()

数据操作

创建DataFrames

创建DataFrames其实和python中的Datarame类似,也是一种表的表达方式。在Saprk中创建DataFrame的来源有很多,很多中API都是通过RDD来创建的,或者读取本地文件;但是在实际的任务中最常见的还是从数据库(Hive,Mongodb,MySQL)中创建DataFrame。由于这里是快速上手所以,该例子只使用read.json()
文件内容为:

{"name":"Kone"}
{"name":"Alices", "age":30}
{"name":"Bob", "age":19}

代码:

from pyspark.sql import SparkSession

if __name__ == '__main__':
    spark=SparkSession.builder\
        .appName("Spark SQL basic test")\
        .config("spark.some.config.option", "some-value")\
        .getOrCreate()
    
    df=spark.read.json("your json file path")
    df.show()

输出为:

+----+------+
| age|  name|
+----+------+
|null|  Kone|
|  30|Alices|
|  19|   Bob|
+----+------+

在DataFrames上的操作

上文讲过DataFrame相当于一个表,则对表有很多结构化的操作,那么其实MySQL的相关操作都可在Spark DataFrame上实现。下面是几种常见的操作:

  • 访问数据
    在访问数据中存在两种访问:属性(df.age)和索引(df["age"])。在Spark中更加建议后一种访问方式:
df=spark.read.json(jsonPath)
df.select(df.age).show()  # 使用属性来访问数据
df.select(df["age"]).show() # 使用索引来访问数据
df.select("name").show() # 使用select来访问数据

输出:

+----+
| age|
+----+
|null|
|  30|
|  19|
+----+

+----+
| age|
+----+
|null|
|  30|
|  19|
+----+

+------+
|  name|
+------+
|  Kone|
|Alices|
|   Bob|
+------+
  • 输出DataFrame的结构
    df.printSchema()

输出:

root
 |-- age: long (nullable = true)
 |-- name: string (nullable = true)
  • 对DataFrame的一列进行操作
df.select(df["name"], df["age"]+1).show()

输出:

+------+---------+
|  name|(age + 1)|
+------+---------+
|  Kone|     null|
|Alices|       31|
|   Bob|       20|
+------+---------+
  • 对表进行筛选
    下面筛选出name的以“K”开头的字符串。
df.filter(df["name"].startswith("K")).show()

输出:

+----+----+
| age|name|
+----+----+
|null|Kone|
+----+----+
  • 聚集操作
    原数据Json文件为:
{"name":"Kone"}
{"name":"Alices", "age":30}
{"name":"Bob", "age":19}
{"name":"Kven", "age":19}
{"name":"Dven", "age":18}

代码为:

df.groupBy(df["age"]).count().show()

输出:

+----+-----+
| age|count|
+----+-----+
|  19|    2|
|null|    1|
|  18|    1|
|  30|    1|
+----+-----+

使用反射推断模式

Spark SQL可以将Row对象的RDD转化为DataFrame,从而推断数据类型。行是通过将键值对列表作为kwargs传递给Row类来构造。

posted @ 2023-02-13 22:41  青山新雨  阅读(150)  评论(0编辑  收藏  举报