Pyspark下操作dataframe方法(2)

news/2024/9/18 10:58:14/ 标签: python, pyspark, spark, hadoop

文章目录

  • Pyspark dataframe
    • count 统计数量
    • createGlobalTempView 创建全局视图表
    • createOrReplaceGlobalTempView 创建全局视图表
    • createTempView 创建临时视图
    • createOrReplaceTempView 创建临时视图
    • crossJoin 返回笛卡尔积
    • cube 维度统计
    • describe 统计列的基本信息
    • distinct 去重
    • drop 删除列
    • dropDuplicates 去重
    • dropna 删除null值
    • dtypes 查看列类型
    • exceptall 剔除交集数据
    • explan 查看执行计划
    • fillna 填充null值
    • filter 过滤
    • first 获取第一条数据的row对象

spark_dataframe_1">Pyspark dataframe

from spark>pyspark.sql import  SparkSession,Row
from spark>pyspark.sql.types import *def init_spark():spark  = SparkSession.builder.appName('LDSX_TEST_DATAFrame') \.config('hive.metastore.uris', 'thrift://hadoop01:9083') \.config('spark.master', "local[2]") \.enableHiveSupport().getOrCreate()return spark
spark = init_spark()# 设置字段类型
schema = StructType([StructField("name", StringType(), True),StructField("age", StringType(), True),StructField("id", StringType(), True),StructField("gender", StringType(), True),
])

count 统计数量

返回dataframe中row的数量

 name|age| id|gender|
+-----+---+---+------+
| ldsx| 12|  1|    男|
|test1| 20|  1|    女|
|test2| 26|  1|    男|
|test3| 19|  1|    女|
|test4| 51|  1|    女|
|test5| 13|  1|    男|
+-----+---+---+------+
root|-- name: string (nullable = true)|-- age: string (nullable = true)|-- id: string (nullable = true)|-- gender: string (nullable = true)
PyDev console: starting.
data.count()
6

createGlobalTempView 创建全局视图表

创建的临时表名已存在报错,查询需要使用global_temp

data.createGlobalTempView('ldsx')
# 临时表名存在后重复设置报错
data.createGlobalTempView('ldsx')
Traceback (most recent call last):
spark>pyspark.errors.exceptions.captured.AnalysisException: [TEMP_TABLE_OR_VIEW_ALREADY_EXISTS] Cannot create the temporary view `ldsx` because it already exists.
Choose a different name, drop or replace the existing view,  or add the IF NOT EXISTS clause to tolerate pre-existing views.
#查询时需要使用global_temp
spark.sql('select * from global_temp.ldsx').show()
+-----+---+---+------+
| name|age| id|gender|
+-----+---+---+------+
| ldsx| 12|  1|    男|
|test1| 20|  1|    女|
|test2| 26|  1|    男|
|test3| 19|  1|    女|
|test4| 51|  1|    女|
|test5| 13|  1|    男|
+-----+---+---+------+

createOrReplaceGlobalTempView 创建全局视图表

创建的全局临时视图名已经存在的,将会进行替换操作不会报错

data.show()
+-----+---+---+------+
| name|age| id|gender|
+-----+---+---+------+
| ldsx| 12|  1|    男|
|test1| 20|  1|    女|
|test2| 26|  1|    男|
|test3| 19|  1|    女|
|test4| 51|  1|    女|
|test5| 13|  1|    男|
+-----+---+---+------+
# 使用dataframe创建全局视图ldsx
data.createOrReplaceGlobalTempView('ldsx')
# 使用新的dataframe创建全局视图ldsx
spark.createDataFrame([(1,2,3)],['a','b','c']).createOrReplaceGlobalTempView('ldsx')
# 结果显示最新的dataframe内容
spark.sql('select * from global_temp.ldsx').show()
+---+---+---+
|  a|  b|  c|
+---+---+---+
|  1|  2|  3|
+---+---+---+

createTempView 创建临时视图

创建的临时表名已存在会报错,sql不需要使用全局域搜索

data.createTempView('ldsx_1')
spark.sql('select * from ldsx_1').show()
+-----+---+---+------+
| name|age| id|gender|
+-----+---+---+------+
| ldsx| 12|  1|    男|
|test1| 20|  1|    女|
|test2| 26|  1|    男|
|test3| 19|  1|    女|
|test4| 51|  1|    女|
|test5| 13|  1|    男|
+-----+---+---+------+

createOrReplaceTempView 创建临时视图

创建临时视图名已经存在的,将会进行替换操作不会报错

data.createOrReplaceTempView('ldsx_1')
data.createOrReplaceTempView('ldsx_1')

crossJoin 返回笛卡尔积

df.show()
+---+-----+
|age| name|
+---+-----+
| 14|  Tom|
| 23|Alice|
| 16|  Bob|
+---+-----+
df2.show()
+------+----+
|height|name|
+------+----+
|    80| Tom|
|    85| Bob|
+------+----+
df.crossJoin(df2).show()
+---+-----+------+----+
|age| name|height|name|
+---+-----+------+----+
| 14|  Tom|    80| Tom|
| 14|  Tom|    85| Bob|
| 23|Alice|    80| Tom|
| 16|  Bob|    80| Tom|
| 23|Alice|    85| Bob|
| 16|  Bob|    85| Bob|
+---+-----+------+----+

cube 维度统计

选中两列的唯一值,分别作为横纵坐标 统计出现次数。

df = spark.createDataFrame([(1, 11), (1, 11), (3, 10), (4, 8), (4, 8)], ["c1", "c2"])
df.show()
+---+---+
| c1| c2|
+---+---+
|  1| 11|
|  1| 11|
|  3| 10|
|  4|  8|
|  4|  8|
+---+---+
df.crosstab("c1", "c2").show()
# 3 跟 10组合数量,3 跟11组合数量为 0 ,3跟8组合数量为0 以此类推
+-----+---+---+---+
|c1_c2| 10| 11|  8|
+-----+---+---+---+
|    3|  1|  0|  0|
|    1|  0|  2|  0|
|    4|  0|  0|  2|
+-----+---+---+---+

describe 统计列的基本信息

返回数量,平均值,标准方差,最小值,最大值(字符串也可统计)。

df = spark.createDataFrame([("Bob", 13, 40.3, 150.5), ("Alice", 12, 37.8, 142.3), ("Tom", 11, 44.1, 142.2)],["name", "age", "weight", "height"]
)
df.show()
+-----+---+------+------+
| name|age|weight|height|
+-----+---+------+------+
|  Bob| 13|  40.3| 150.5|
|Alice| 12|  37.8| 142.3|
|  Tom| 11|  44.1| 142.2|
+-----+---+------+------+
df.describe(['age']).show()
+-------+----+
|summary| age|
+-------+----+
|  count|   3|
|   mean|12.0|
| stddev| 1.0|
|    min|  11|
|    max|  13|
+-------+----+
df.describe(['name']).show()
+-------+-----+
|summary| name|
+-------+-----+
|  count|    3|
|   mean| null|
| stddev| null|
|    min|Alice|
|    max|  Tom|
+-------+-----+

distinct 去重

去重完全重复数据返回dataframe

df.show()
+---+------+
|age|  name|
+---+------+
| 14|   Tom|
| 23| Alice|
| 23| Alice|
| 23|Alice1|
+---+------+
df.distinct().show()
+---+------+
|age|  name|
+---+------+
| 14|   Tom|
| 23| Alice|
| 23|Alice1|
+---+------+

drop 删除列

df.show()
+-----+---+------+------+
| name|age|weight|height|
+-----+---+------+------+
|  Bob| 13|  40.3| 150.5|
|Alice| 12|  37.8| 142.3|
|  Tom| 11|  44.1| 142.2|
+-----+---+------+------+
df.drop('name').show()
+---+------+------+
|age|weight|height|
+---+------+------+
| 13|  40.3| 150.5|
| 12|  37.8| 142.3|
| 11|  44.1| 142.2|
+---+------+------+
df.drop(*['name','age']).show()
+------+------+
|weight|height|
+------+------+
|  40.3| 150.5|
|  37.8| 142.3|
|  44.1| 142.2|
+------+------+

dropDuplicates 去重

drop_duplicates 别名效果一样

from spark>pyspark.sql import Row
df = spark.createDataFrame([Row(name='Alice', age=5, height=80),Row(name='Alice', age=5, height=80),Row(name='Alice', age=10, height=80)
])
df.show()
+-----+---+------+
| name|age|height|
+-----+---+------+
|Alice|  5|    80|
|Alice|  5|    80|
|Alice| 10|    80|
+-----+---+------+
df.dropDuplicates().show()
+-----+---+------+
| name|age|height|
+-----+---+------+
|Alice|  5|    80|
|Alice| 10|    80|
+-----+---+------+
df.dropDuplicates(['name']).show()
+-----+---+------+
| name|age|height|
+-----+---+------+
|Alice|  5|    80|
+-----+---+------+

dropna 删除null值

dropna() 参数可选项 all,全部为空的行,any只要存在null行就删掉,默认为any

df.show()
+----+------+-----+
| age|height| name|
+----+------+-----+
|  10|    80|Alice|
|   5|  null|  Bob|
|null|  null|  Tom|
|null|  null| null|
+----+------+-----+
df.na.drop().show()
+---+------+-----+
|age|height| name|
+---+------+-----+
| 10|    80|Alice|
+---+------+-----+
df.dropna().show()
+---+------+-----+
|age|height| name|
+---+------+-----+
| 10|    80|Alice|
+---+------+-----+
df.dropna('all').show()
+----+------+-----+
| age|height| name|
+----+------+-----+
|  10|    80|Alice|
|   5|  null|  Bob|
|null|  null|  Tom|
+----+------+-----+

dtypes 查看列类型

df.dtypes
[('age', 'bigint'), ('height', 'bigint'), ('name', 'string')]

exceptall 剔除交集数据

返回一个新的DataFrame,其中包含此DataFrame中的行,但不包含在另一个DataFrame中,同时保留重复项。

df1,df2,就是df1剔除(df1与df2交集)。有几个剔除几个重复项保留

df1 = spark.createDataFrame([("a", 1), ("a", 1), ("a", 1), ("a", 2), ("b",  3), ("c", 4)], ["C1", "C2"])
df2 = spark.createDataFrame([("a", 1), ("b", 3)], ["C1", "C2"])
df1.show()
+---+---+
| C1| C2|
+---+---+
|  a|  1|
|  a|  1|
|  a|  1|
|  a|  2|
|  b|  3|
|  c|  4|
+---+---+
df2.show()
+---+---+
| C1| C2|
+---+---+
|  a|  1|
|  b|  3|
+---+---+
df1.exceptAll(df2).show()
+---+---+
| C1| C2|
+---+---+
|  a|  1|
|  a|  1|
|  a|  2|
|  c|  4|
+---+---+

explan 查看执行计划

不加参数(逻辑和物理)计划展示。

可选参数,指定计划的预期输出格式。
simple:只打印一份实物计划。
extended:打印逻辑和物理计划。
codegen:打印物理计划和生成的代码(如果可用)。
codegen:打印逻辑计划和统计数据(如果可用)。
formatted:将解释输出分为两部分:物理计划大纲和节点详细信息。

df1.explain()
== Physical Plan ==
*(1) Scan ExistingRDD[C1#1146,C2#1147L]

fillna 填充null值

fillna() 别名 na.fill() ,如果列的类型不符合填充的类型,则这列不填补

df.show()
+----+------+-----+----+
| age|height| name|bool|
+----+------+-----+----+
|  10|  80.5|Alice|null|
|   5|  null|  Bob|null|
|null|  null|  Tom|null|
|null|  null| null|true|
+----+------+-----+----+df.na.fill(100).show()
+---+------+-----+----+
|age|height| name|bool|
+---+------+-----+----+
| 10|  80.5|Alice|null|
|  5| 100.0|  Bob|null|
|100| 100.0|  Tom|null|
|100| 100.0| null|true|
+---+------+-----+----+
# 针对填充
df.na.fill({'age': 50, 'name': 'ldsx','bool':'false','height':100}).show()
+---+------+-----+-----+
|age|height| name| bool|
+---+------+-----+-----+
| 10|  80.5|Alice|false|
|  5| 100.0|  Bob|false|
| 50| 100.0|  Tom|false|
| 50| 100.0| ldsx| true|
+---+------+-----+-----+

filter 过滤

使用sql表达式可以把filter换成where

f = spark.createDataFrame([(2, "Alice"), (5, "Bob")], schema=["age", "name"])
df.show()
+---+-----+
|age| name|
+---+-----+
|  2|Alice|
|  5|  Bob|
+---+-----+
df.filter(df.age>=5).show()
+---+----+
|age|name|
+---+----+
|  5| Bob|
+---+----+

first 获取第一条数据的row对象

df.first()
Row(age=2, name='Alice')

http://www.ppmy.cn/news/1525888.html

相关文章

使用 Vue.js 将数据对象的值放入另一个数据对象中

1.直接赋值 最简单的方法是直接赋值。这种方法适用于将一个对象的值直接复制到另一个对象的属性中。 示例代码 <template><div><p>原始数据对象: {{ originalData }}</p><p>目标数据对象: {{ targetData }}</p><button click"c…

Mac 上终端使用 MySql 记录

文章目录 下载安装终端进入 MySql常用操作查看数据库选择一个数据库查看当前选择的数据库Navcat 打开提示报错参考文章 下载安装 先下载社区版的 MySql 安装的过程需要设置 root 的密码&#xff0c;这个是要进入数据库所设定的&#xff0c;所以要记住 终端进入 MySql 首先输…

【LeetCode 算法笔记】739. 每日温度

目录 问题描述暴力解法栈 问题描述 给定一个整数数组 temperatures &#xff0c;表示每天的温度&#xff0c;返回一个数组 answer &#xff0c;其中 answer[i] 是指对于第 i 天&#xff0c;下一个更高温度出现在几天后。如果气温在这之后都不会升高&#xff0c;请在该位置用 0…

使用Rustup快速无缝升级Rust

rust update 升级 Rustup 是 Rust 官方的跨平台 Rust 安装工具。我们可以使用rustup升级rust版本 rustup updaterustup is not installed at ‘E:\cargo’ 意思是说’E:\argo’未安装rustup 将原来C:\Users\用户名\.cargo\bin下的文件复制到新的E:\cargo\bin $ rustup upda…

MyCat管理及监控

目录 MyCat原理 MyCat管理 MyCat-web 安装Zookeeper 安装Mycat-web MyCat原理 在MyCat中&#xff0c;当执行一条SQL语句时&#xff0c;MyCat需要进行SQL解析、分片分析、路由分析、读写分离分析 等操作&#xff0c;最终经过一系列的分析决定将当前的SQL语句到底路由到那几…

【Android Studio】2024.1.1最新版本AS调试老项目(老版AS项目文件、旧gradle)导入其他人的项目

文章目录 实验环境开始修改项目文件1. 删除.gradle及.idea两个文件夹2.修改SDK路径&#xff08;本地SDK存放路径&#xff09;3.修改gradle版本4.修改gradle插件版本&#xff08;AGP&#xff09;5.修改JDK版本 实验环境 Android Studio 版本 项目版本 开始修改项目文件 1. 删…

后端面试经典问题汇总

后端面试经典问题汇总 后端开发在现代互联网应用中扮演着关键角色&#xff0c;涉及的数据处理、业务逻辑和系统性能等方面在面试中常常会被深入考察。本文将总结一些后端面试中常见的经典问题&#xff0c;并给出简单的解答思路。 1. HTTP 协议 问题&#xff1a;请解释 HTTP …

电脑与电脑之间怎么快速传输文件?

若两台电脑在同一局域网&#xff0c;可以使用Windows远程桌面传输文件&#xff0c;或者使用远程看看这款免费的远程桌面软件&#xff0c;它支持在不同的网络之间传输文件&#xff0c;而且速度快、安全性高。 步骤1. 在两台电脑上下载、安装并运行远程看看。 步骤2. 注册一个远…

Java面试篇基础部分-Java泛型详解

导语   Java中泛型的本质是参数化类型,泛型提供了编译时类型的安全检测机制。泛型机制允许程序在编译的时候检测非法的类型,例如要实现一个对于字符串、整型、浮点型、对象类型等比较其大小的方法,就可以使用泛型,在使用的时候在明确所要比较的数据类型就可以了。 当然如…

React 前端应用结合 Nginx 部署指南及常见错误排查

在现代 Web 开发中&#xff0c;React 已成为构建用户界面的流行选择&#xff0c;而 Nginx 则是一个高性能的 Web 服务器&#xff0c;广泛用于静态文件的托管和负载均衡。在本篇博客中&#xff0c;我们将详细介绍如何将一个 React 应用部署到 Nginx 上&#xff0c;并探讨在部署过…

Android 设计模式

设计模式六大原则 单一职责原则&#xff08;Single Responsibility Principle, SRP&#xff09; 每个类应该仅有一个引起它变化的原因。 这意味着一个类只应该专注完成一项任务或功能。 举例 考虑一个 User 类&#xff0c;用于表示用户信息&#xff0c;例如用户名和密码。如…

416. 分割等和子集

目录 一&#xff1a;题目&#xff1a; 二&#xff1a;代码&#xff1a; 三&#xff1a;结果&#xff1a;、 一&#xff1a;题目&#xff1a; 给你一个 只包含正整数 的 非空 数组 nums 。请你判断是否可以将这个数组分割成两个子集&#xff0c;使得两个子集的元素和相等。 …

EmguCV学习笔记 C# 11.5 目标检测

版权声明&#xff1a;本文为博主原创文章&#xff0c;转载请在显著位置标明本文出处以及作者网名&#xff0c;未经作者允许不得用于商业目的。 EmguCV是一个基于OpenCV的开源免费的跨平台计算机视觉库,它向C#和VB.NET开发者提供了OpenCV库的大部分功能。 教程VB.net版本请访问…

Git提交有乱码

服务器提交记录如图 可知application.properties中文注释拉黄线 &#xff0c;提示Unsupported characters for the charset ISO-8859-1 打开settings - Editor - File Encodings 因为我们项目的其他文件都是UTF-8&#xff0c;所以&#xff0c;我们将默认值都改成UTF-8 然后…

Android SDK和NDK的区别

Android SDK&#xff08;Software Development Kit&#xff0c;软件开发工具包&#xff09;和NDK&#xff08;Native Development Kit&#xff0c;本地开发工具包&#xff09;在Android应用开发中扮演着不同的角色&#xff0c;它们各自具有独特的功能和优势。 一、定义与功能 …

【工具推荐】ThinkphpGUI - 一款Thinkphp框架漏洞扫描集合工具,一键getshell。

0x00 工具介绍 ThinkphpGUI是一款Thinkphp框架漏洞扫描集合工具。 0x01 下载链接 ThinkphpGUI下载链接: 夸克网盘分享 0x02 功能介绍 ThinkPHP 5.0 RCE ThinkPHP 5.0.10 RCE ThinkPHP 5.0.22/5.1.29 RCE ThinkPHP 5.0.23 RCE ThinkPHP 5.0.24-5.1.30 RCE ThinkPHP 5 文…

图说GPT网络结构(参数量与计算量)

现在AI领域的主流模型几乎都是Transformer网络架构衍生而来。大热的LLM中的生成类模型很多都是来自于Transformer的变体&#xff0c;即decoder only架构。而GPT就是该类中的经典模型。尽管现在变体甚多&#xff0c;但大多没有根本性地改变其套路。 为了阐述方便&#xff0c;首…

Linux echo,printf 命令

参考资料 【Linux】ハイフンをいっぱい出したかっただけなのに【printfコマンド】 目录 一. echo命令1.1 -n 选项1.2 -e 选项1.3 配合扩展实现批量换行输出1.3.1 xargs -n 11.3.2 tr \n1.3.3 xargs printf "%s\n"1.4 ANSI转义序列1.5 彩色文本输出 二. printf 命令…

敏捷开发方法例题

答案&#xff1a;B 敏捷方法 特点 极限编程XP 4大价值观&#xff0c;5大原则&#xff0c;12个最佳实践 水晶法 认为每一个不同的项目都需要一套不同的策略&#xff0c;约定和方法论&#xff0c;认为人对软件质量有重要影响&#xff0c;因此随着项目质量和开发人员须知的提…

速盾:你知道高防 IP 和高防 CDN 的区别吗?

在当今网络安全形势日益严峻的情况下&#xff0c;网站的安全防护成为了企业和个人关注的焦点。高防 IP 和高防 CDN 作为两种常见的网络安全防护手段&#xff0c;被广泛应用于网站的安全防护中。那么&#xff0c;高防 IP 和高防 CDN 有什么区别呢&#xff1f;防护网站哪个更好呢…