Spark SQL 简介及参考链接
Spark 是一个基于内存的用于处理大数据的集群计算框架。它提供了一套简单的编程接口,从而使得应用程序开发者方便使用集群节点的CPU,内存,存储资源来处理大数据。
Spark API提供了Scala, Java, Python和R的编程接口,可以使用这些语言来开发Spark应用。为了用Spark支持Python,Apache Spark社区发布了一个工具PySpark。使用PySpark,您也可以使用Python编程语言处理RDD。
Spark SQL将 SQL和HiveSQL的简单与强大融合到一起。 Spark SQL是一个运行在Spark上的Spark库。它提供了比Spark Core更为高层的用于处理结构化数据的抽象.
Spark DataFrame 派生于RDD类,分布式但是提供了非常强大的数据操作功能。 本文主要梳理Spark DataFrame的常用方法,之后写一下与DataFrame操作密切配合的Spark SQL内置函数
和 用户UDF (用户定义函数) 和 UDAF (用户定义聚合函数)
- Spark-sql_programming-guide
- pyspark.sql API
- Big Data Analysis with Spark, Mohammed Guller
pyspark.sql 核心类
- pyspark.SparkContext: Spark 库的主要入口点,它表示与Spark集群的一个连接,其他重要的对象都要依赖它.SparkContext存在于Driver中,是Spark功能的主要入口。
代表着与Spark集群的连接,可以在集群上创建RDD,accumulators和广播变量 - pyspark.RDD: 是Spark的主要数据抽象概念,是Spark库中定义的一个抽象类。
- pyspark.streaming.StreamingContext 一个定义在Spark Streaming库中定义的类, 每一个Spark Streaming 应用都必须创建这个类
- pyspark.streaming.DStrem:离散数据流,是Spark Streaming处理数据流的主要对象
- pyspark.sql.SparkSession: 是DataFrame和SQL函数的主要入口点。
- pyspark.sql.DataFrame: 是Spark SQL的主要抽象对象,若干行的分布式数据,每一行都要若干个有名字的列。 跟R/Python中的DataFrame 相像
,有着更丰富的优化。DataFrame可以有很多种方式进行构造,例如: 结构化数据文件,Hive的table, 外部数据库,RDD。 - pyspark.sql.Column DataFrame 的列表达.
- pyspark.sql.Row DataFrame的行数据
环境配置
- os: Win 10
- spark: spark-2.4.4-bin-hadoop2.7
- python:python 3.7.4
- java: jdk 1.8.0_221
从SparkSession 开始
Spark 2.20 以后 SparkSession 合并了 SQLContext 和 HiveContext, 同时支持Hive, 包括HIveSOL, Hive UDFs 的入口, 以及从Hive table中读取数据。
from pyspark.sql import SparkSession
spark = SparkSession \
.builder \
.appName("Python Spark SQL basic example") \
.config("spark.some.config.option", "some-value") \
.getOrCreate()
## 获取或者新建一个 sparkSession
#spark master URL. 本地为local, “local[4]” 本地4核,
# or “spark://master:7077” to run on a Spark standalone cluster
创建DataFrame
有了SparkSession, DataFrame可以从已有的RDD, Hive table, 或者其他spark的数据源进行创建
# spark is an existing SparkSession
# 从文件读取
# 工作目录: spark安装路径SPARK_HOME
## read.json
df = spark.read.json("examples/src/main/resources/people.json")
df.show()
+----+-------+
| age| name|
+----+-------+
|null|Michael|
| 30| Andy|
| 19| Justin|
+----+-------+
df = spark.read.load("examples/src/main/resources/people.json", format="json") #format: Default to ‘parquet’
## read.csv
df_csv = spark.read.csv("examples/src/main/resources/people.csv",sep=';', header= True)
## read.text
df_txt = spark.read.text("examples/src/main/resources/people.txt")
## read.parquet
df_parquet = spark.read.parquet("examples/src/main/resources/users.parquet")
## orc
df_orc = spark.read.orc("examples/src/main/resources/users.orc")
## rdd
sc = spark.sparkContext
rdd = sc.textFile('examples/src/main/resources/people.json')
df_rdd1 = spark.read.json(rdd)
# createDataFrame: rdd, list, pandas.DataFrame
df_list = spark.createDataFrame([('Tom', 80), ('Alice', None)], ["name", "height"])
l = [('Alice', 1)]
rdd = sc.parallelize(l)
df_rdd2 = spark.createDataFrame(rdd,['name', 'age'])
df_rdd2.show()
+-----+---+
| name|age|
+-----+---+
|Alice| 1|
+-----+---+
## with scheme
from pyspark.sql.types import *
schema = StructType([
StructField("name", StringType(), True),
StructField("age", IntegerType(), True)])
df3 = spark.createDataFrame(rdd, schema)
#from pandas
import pandas
df_pandas = spark.createDataFrame(pandas.DataFrame([[1, 2]]))
df_pandas.show()
+---+---+
| 0| 1|
+---+---+
| 1| 2|
+---+---+
DataFrame常用方法
关于DataFrame的操作,感觉上和pandas.DataFrame的操作很类似,很多时候都可以触类旁通。
Spark 的操作分为两部分, 转换(transformation) 和 执行(actions). 操作是lazy模式,只有遇到执行操作才会执行
创建DataFrame, customers, products, sales
customers = [(1,'James',21,'M'), (2, "Liz",25,"F"), (3, "John", 31, "M"),\
(4, "Jennifer", 45, "F"), (5, "Robert", 41, "M"), (6, "Sandra", 45, "F")]
df_customers = spark.createDataFrame(customers, ["cID", "name", "age", "gender"]) # list -> DF
df_customers.show()
+---+--------+---+------+
|cID| name|age|gender|
+---+--------+---+------+
| 1| James| 21| M|
| 2| Liz| 25| F|
| 3| John| 31| M|
| 4|Jennifer| 45| F|
| 5| Robert| 41| M|
| 6| Sandra| 45| F|
+---+--------+---+------+
products = [(1, "iPhone", 600, 400), (2, "Galaxy", 500, 400), (3, "iPad", 400, 300),\
(4, "Kindel",200,100), (5, "M