Pyspark DataFrame DSL基本使用

本文介绍了Pyspark DataFrame的基本使用,包括创建SparkSession、从文件和数据库获取DataFrame的方法,以及DataFrame的操作方式、性能优化、提交任务的方式和一些细节。重点讲解了从文本文件和数据库读取数据的步骤,以及SQL和DSL操作DataFrame的区别。还提到了性能优化的间接和直接方法,如设置并行度、重分区和缓存。最后,文章提供了UDF的使用示例。
摘要由CSDN通过智能技术生成

1. 基本使用说明

  1. 创建DataFrame的通用前提及方法;
    1. 创建SparkSession的实例;
    2. SS的实例再创建DataFrame;
  2. 操作DataFrame的两种方式;
    1. 类pandas方法;
    2. 类SQL方法;
  3. 简单的性能优化;
  4. 写好脚本后,如何提交;
    1. 用spark-submit提交的方法;
  5. DataFrame的一些细节

2. 获取DataFrame的通用前提及方法

2.1. 创建SparkSession

  1. 必须先创建SparkSession,再通过SparkSession来得到一个或多个DataFrame。主要原因如下:
    1. Spark是一个集群计算框架,其中需要用到通信,故使用通用的名称Session来代表含有DataFrame的应用程序。获取SparkSession的实例之后,才能过其拥有的方法来创建DataFrame;
  2. 创建SparkSession实例 的示例:
    from pyspark.sql import SparkSession spark = SparkSession.builder.appName("app_name").config("key", "value").config("key", "value").getOrCreate()
  3. .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. 从文本文件获取
  1. 读取文本文件获取:
df = spark.read.format("csv").option("seq", ",").option("header", "true").load("file://file_path")
  1. 因为文本文件不含数据类型,为了正确处理数据,需要转换数据格式:
    1. 读取的时候转换,.option("header", "true"):不推荐,此种办法由Spark根据DataFrame的第一行数据推断各列的数据类型,但是存在推断错误的可能性;
    2. 读取的时候转换,.schema(STRUCTED_TYPE):将1的option替换为此种,要求人工先设定好各列的数据类型,且是Spark的数据类型,具体数据类型见《spark权威指南》P58;
    from pyspark.sql.types import StructField,
pandas DataFrame 转换为 PySpark DataFrame 的方法通常有两种,一种是使用 PySpark 自带的 API,另一种是使用第三方库 PyArrow。下面分别介绍这两种方法。 方法1:使用 PySpark API 首先需要将 pandas DataFrame 转换为 PySpark DataFrame,可以使用 `createDataFrame()` 方法。这个方法需要两个参数,第一个参数是 pandas DataFrame,第二个参数是 PySpark DataFrame 的 schema。 示例代码如下: ```python from pyspark.sql import SparkSession import pandas as pd spark = SparkSession.builder.appName("pandas_to_spark").getOrCreate() # 创建一个 pandas DataFrame pdf = pd.DataFrame({ "name": ["Alice", "Bob", "Charlie"], "age": [25, 30, 35] }) # 将 pandas DataFrame 转换为 PySpark DataFrame sdf = spark.createDataFrame(pdf) sdf.show() ``` 输出结果如下: ``` +-------+---+ | name|age| +-------+---+ | Alice| 25| | Bob| 30| |Charlie| 35| +-------+---+ ``` 方法2:使用 PyArrow 首先需要安装 PyArrow 库,可以使用以下命令进行安装: ```bash pip install pyarrow ``` 然后使用 `from_pandas()` 方法将 pandas DataFrame 转换为 PySpark DataFrame。 示例代码如下: ```python from pyspark.sql import SparkSession import pandas as pd import pyarrow spark = SparkSession.builder.appName("pandas_to_spark").getOrCreate() # 创建一个 pandas DataFrame pdf = pd.DataFrame({ "name": ["Alice", "Bob", "Charlie"], "age": [25, 30, 35] }) # 将 pandas DataFrame 转换为 PySpark DataFrame sdf = spark.createDataFrame(pyarrow.Table.from_pandas(pdf)) sdf.show() ``` 输出结果与方法1相同。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值