Pyspark DataFrame DSL基本使用

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

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, StructType, StringType, LongType
    myManualSchema = StructType
### PySpark使用方法及数据分析教程 #### 1. 安装与配置 为了能够顺利使用 PySpark,首先需要完成其安装和配置工作。PySpark 可以通过 `pip` 工具直接安装[^1]: ```bash pip install pyspark ``` 如果计划在本地环境中模拟分布式计算,则还需要下载并解压 Apache Spark 的二进制版本[^4]。完成后设置环境变量 `SPARK_HOME` 和路径变量即可。 --- #### 2. 初始化 PySpark 环境 在 Python 脚本或交互式解释器中导入 PySpark 并初始化 SparkSession 对象,这是进入 PySpark 数据处理的核心入口[^2]: ```python from pyspark.sql import SparkSession # 创建 SparkSession 实例 spark = SparkSession.builder \ .appName("ExampleApp") \ .config("spark.some.config.option", "some-value") \ .getOrCreate() ``` 上述代码创建了一个名为 `ExampleApp` 的 Spark 应用程序实例,并允许进一步调整配置参数。 --- #### 3. 加载数据源 PySpark 支持多种数据格式的加载操作,例如 CSV、JSON、Parquet 文件等。以下是加载 CSV 文件的一个例子[^3]: ```python df = spark.read.csv("path/to/Pokemon.csv", header=True, inferSchema=True) # 显示前几行数据 df.show(5) ``` 注意:当遇到含有空值的数据集时,可能需要额外指定选项来避免解析错误。 --- #### 4. 基础数据操作 利用 DataFrame API 执行常见的 ETL (Extract-Transform-Load) 流程: - **过滤**: 提取满足条件的部分记录。 ```python filtered_df = df.filter(df['Type'] == 'Fire') ``` - **分组聚合**: 计算某些字段上的汇总统计量。 ```python grouped_df = df.groupBy('Generation').count() ``` - **排序**: 按照特定列重新排列结果集合。 ```python sorted_df = grouped_df.sort(grouped_df['count'].desc()) ``` 以上每一步都会返回一个新的 DataFrame 对象作为中间状态表示。 --- #### 5. SQL 查询支持 除了基于 DSL 风格的方法链调用外,还可以借助注册临时表的方式实现更灵活复杂的查询逻辑: ```python df.createOrReplaceTempView("pokemon") result = spark.sql(""" SELECT Type, COUNT(*) AS Count FROM pokemon GROUP BY Type ORDER BY Count DESC LIMIT 10; """) result.show() ``` 此功能特别适合那些熟悉传统关系型数据库语句的人群迁移至大数据领域学习曲线平滑过渡之需。 --- #### 6. 分布式执行机制剖析 最终构建好的 Transformation/Dataset 将会被翻译成底层 RDD 表达形式并通过 DAGScheduler 来规划最优物理执行计划,在多节点集群上并发运行从而达到高效性能目标。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值