1. 基本使用说明
- 创建DataFrame的通用前提及方法;
- 创建SparkSession的实例;
- SS的实例再创建DataFrame;
- 操作DataFrame的两种方式;
- 类pandas方法;
- 类SQL方法;
- 简单的性能优化;
- 写好脚本后,如何提交;
- 用spark-submit提交的方法;
- DataFrame的一些细节
2. 获取DataFrame的通用前提及方法
2.1. 创建SparkSession
- 必须先创建SparkSession,再通过SparkSession来得到一个或多个DataFrame。主要原因如下:
- Spark是一个集群计算框架,其中需要用到通信,故使用通用的名称Session来代表含有DataFrame的应用程序。获取SparkSession的实例之后,才能过其拥有的方法来创建DataFrame;
- 创建SparkSession实例 的示例:
from pyspark.sql import SparkSession spark = SparkSession.builder.appName("app_name").config("key", "value").config("key", "value").getOrCreate()
- .config相关设置:
注意:代码内的配置级别最高,写入代码的设置一定会生效,无法通过各种方法进行改变。
相关设置 | 功能 |
---|---|
.config("spark.sql.shuffle.partitions", 5) |
shuffle之后数据分区为5个,适当的设置可以提高效率,但注意将分区的数据传入UDF时,会进行区内计算,而非汇总计算,所以在UDF之前,要将分区汇总为1个,df.repartition(1) |
.config("spark.sql.session.timeZone", "CST") |
时区的设置需要跟数据库保持一致,需要特别注意一个点,“CST"可以代表美国时间"GMT-6:00”,也可以代表中国时间"GMT+8:00",问题便在于数据库会将其解析为中国时间,而Spark会将其解析为美国时间,则就导致了严重问题,看到的yyyy-MM-dd 两者是一致的,但是转为时间戳时,数据库和Spark的差异会是14*3600的差别。 |
.config("spark.sql.crossJoin.enabled", "true") |
两表join的时候,Spark默认不开启笛卡尔积,所以手动开启,如不开启,在笛卡尔积的时候会报错。 |
.config("spark.sql.execution.arrow.enabled", "ture") |
Spark的df可以和Pandas的df互相转换,转换方法为df.toPandas() ,开启后转换效率提高。 |
2.2. 获取DataFrame
2.2.1. 从文件获取DataFrame的方法
从文件获取DataFrame的方法有2种,从文本文件获取和从数据库获取:
2.2.1.1. 从文本文件获取
- 读取文本文件获取:
df = spark.read.format("csv").option("seq", ",").option("header", "true").load("file://file_path")
- 因为文本文件不含数据类型,为了正确处理数据,需要转换数据格式:
- 读取的时候转换,
.option("header", "true")
:不推荐,此种办法由Spark根据DataFrame的第一行数据推断各列的数据类型,但是存在推断错误的可能性; - 读取的时候转换,
.schema(STRUCTED_TYPE)
:将1的option替换为此种,要求人工先设定好各列的数据类型,且是Spark的数据类型,具体数据类型见《spark权威指南》P58;
from pyspark.sql.types import StructField,
- 读取的时候转换,