从 Pyspark UDF 调用另一个自定义 Python 函数

PySpark,通常称为 Apache Spark 的 Python API,是为分布式数据处理而创建的。它使用户能够高效且可扩展地对大型数据集进行复杂的计算和转换。用户定义函数 (UDF),允许用户创建自己独特的函数并将其应用到 Spark DataFrame 或 RDD,这是 PySpark 的主要功能之一 。使用 UDF,可以扩展和定制 PySpark 的功能以满足某些需求。在本文中,我们将学习如何从 Pyspark UDF 调用另一个自定义 Python 函数。

从 Pyspark UDF 调用另一个自定义 Python 函数

Python 编码的 PySpark UDF 提供了调用其他Python 函数的能力,无论它们是内置函数还是来自外部库的用户定义函数。通过使用户能够利用现有的 Python 代码,此功能提高了 UDF 的模块化和可重用性。在分布式 PySpark 环境中,用户可以轻松实现特定领域的逻辑、执行具有挑战性的计算或使用尖端算法。用户可以通过从 PySpark UDF 调用 Python 函数来充分利用 Python 庞大的库和功能生态系统的全部潜力。

从 PySpark UDF 调用另一个自定义 Python 函数的步骤

让我们看看从 Pyspark UDF 调用另一个自定义 Python 函数的分步过程。

第1步:导入必要的模块

首先,从"pyspark.sql.functions" 模块导入"udf" ,该模块提供了处理 Spark DataFrame 的工具。

python 复制代码
from pyspark.sql.functions import udf

第 2 步:启动 Spark 会话

接下来,通过导入必要的 Spark 模块来创建 Spark 会话。

python 复制代码
from pyspark.sql import SparkSession
spark = SparkSession.builder.getOrCreate()

第 3 步:创建数据框

下一步是创建一个数据帧,用于在 Spark 中执行操作。

python 复制代码
data = [("Marry", 25), ("Sunny", 30), ("Ram", 35)]
df = spark.createDataFrame(data, ["name", "age"])

第 4 步:定义自定义 Python 函数

然后定义我们希望从 PySpark UDF 调用的自定义 Python 函数。我们可以在此函数中使用我们需要的任何逻辑或计算。例如,将字符串转换为大写字符串的函数。

python 复制代码
def to_uppercase(string):
    return string.upper()

第 5 步: 创建 PySpark UDF

创建自定义 Python 函数后,使用 "pyspark.sql.functions" 模块中的 UDF 函数构造 PySpark UDF。 "udf()" 函数应接收自定义 Python 函数作为参数。自定义函数注册为 UDF,以便它可以应用于 DataFrame 列。

python 复制代码
to_uppercase_udf = udf(to_uppercase)

步骤 6:将 UDF 应用到 DataFrame

创建 PySpark UDF 后,使用 "withColumn()" 函数将其应用到 DataFrame 列。在 DataFrame 中,此方法添加新列或删除现有列。DataFrame 的每一行都会调用 UDF 一次,将自定义 Python 函数应用于指定列并生成所需的结果。

python 复制代码
df = df.withColumn("name_uppercase", to_uppercase_udf(df["name"]))

第7步: 显示数据框

最后,我们将使用 "show()" 函数显示数据框以查看对其所做的更改。

python 复制代码
df.show()

按照这些说明,我们可以通过从 PySpark UDF 调用另一个自定义 Python 函数来在 PySpark DataFrame 上执行自定义计算和转换。

从 PySpark UDF 调用另一个自定义 Python 函数的示例

现在,让我们看看从 Pyspark UDF 调用 Python 自定义函数的几个不同示例。

示例 1:将 DataFrame 列转换为大写

在此示例中,我们将使用 Pyspark 创建一个包含人员姓名和年龄的Spark 数据框 "df" 。然后我们将定义一个自定义 Python 函数" to_uppercase()" ,它将Python 字符串作为参数并将其转换为大写并将结果存储在该数据帧的新列中。然后我们使用 Pyspark 的" udf() "函数创建 Pyspark UDF。

Python3

python 复制代码
# 导入模块
from pyspark.sql import SparkSession
from pyspark.sql.functions import udf

# 定义自定义Python函数
def to_uppercase(string):
	return string.upper()

# 创建一个SparkSession
spark = SparkSession.builder.getOrCreate()

# 创建一个DataFrame
data = [("Marry", 25), ("Sunny", 30), ("Ram", 35)]
df = spark.createDataFrame(data, ["name", "age"])

# 创建 PySpark UDF
to_uppercase_udf = udf(to_uppercase)

# 将UDF应用于"name"列
df = df.withColumn("name_uppercase", to_uppercase_udf(df["name"]))

# 用于显示DataFrame的函数
df.show()

输出:

示例 2: 调用组合多个 DataFrame 列的自定义 Python 函数

在此示例中,我们将创建一个包含 2 列的数据框 - ' first_name ' 和 ' last_name '。然后创建一个 Python 自定义函数" combine_columns ",它将"first_name"和"last_name"作为参数,并返回一个列,将它们组合在一起以创建" full_name"

Python3

python 复制代码
# 导入模块
from pyspark.sql import SparkSession
from pyspark.sql.functions import udf

# 自定义Python函数
def combine_columns(col1, col2):
	return col1 + " " + col2

# 创建SparkSession
spark = SparkSession.builder.getOrCreate()

# 创建一个DataFrame
data = [("John", "Doe"), ("Ram", "Kumar"), ("Smith", "Jones")]
df = spark.createDataFrame(data, ["first_name", "last_name"])

# 制作PySpark UDF
combine_columns_udf = udf(combine_columns)

# 将 UDF应用于"first_name"和"last_name"列
df = df.withColumn("full_name", combine_columns_udf(df["first_name"], df["last_name"]))

# 用于显示DataFrame的函数
df.show()

输出:

示例 3:使用外部库从 PySpark UDF 调用自定义 Python 函数

对于更复杂的计算,PySpark 使我们能够在定制函数中使用外部 Python 库。假设我们希望使用模糊匹配库 "fuzzywuzzy" 和名为 "calculate_similarity" 的自定义 Python 方法来比较两个文本之间的相似度。

在此示例中,我们从Python 中的 fuzzywuzzy 库导入"fuzz"模块,并使用" fuzz.ratio() "函数来确定两个文本之间的相似程度。我们创建了独特的 Python 方法" calculate_similarity() "来使用输入字符串调用 "fuzz.ratio()" 算法。使用 "udf()" 函数,我们构建一个名为 "similarity_udf" 的 UDF 并定义输入和输出类型。最后,我们使用 "withColumn()" 方法将 UDF 应用于"string1"和"string2"列,并显示具有相似率的结果 DataFrame。

Python3

python 复制代码
# 导入模块
from pyspark.sql import SparkSession
from pyspark.sql.functions import udf
from pyspark.sql.types import IntegerType
from fuzzywuzzy import fuzz

# 创建SparkSession
spark = SparkSession.builder.getOrCreate()

# 使用列"string1"和"string2"获取的示例DataFrame
data = [("apple", "apples"), ("banana", "bananas"), ("cat", "dog")]
df = spark.createDataFrame(data, ["string1", "string2"])

# 创建自定义Python函数
def calculate_similarity(str1, str2):
	return fuzz.ratio(str1, str2)

# 从自定义函数创建自定义项
similarity_udf = udf(calculate_similarity, IntegerType())

# 应用UDF计算相似性
df.withColumn("similarity", similarity_udf(df["string1"], df["string2"])).show()

输出:

示例 4:应用具有复杂逻辑的自定义 Python 函数

让我们看一个示例,其中有一个 DataFrame,其中有一列表示句子的字符串,并且我们希望使用名为" count_words" 的自定义 Python 函数来确定每个短语中存在多少个单词。

在此图中,自定义 Python 函数 "count_words" 使用 "split()" 方法将输入文本分解为单词,并使用 "len()" 函数获取单词计数。使用 "udf()" 函数,我们构建一个名为 "count_udf" 的 UDF并定义输入和输出类型。最后,我们使用 "withColumn()" 方法将 UDF 应用到 "sentence" 列,并显示带有字数统计的结果 DataFrame。

Python3

python 复制代码
# 导入模块
from pyspark.sql import SparkSession
from pyspark.sql.functions import udf
from pyspark.sql.types import IntegerType

# 创建 SparkSession
spark = SparkSession.builder.getOrCreate()

# 具有列"sentence"的示例DataFrame
data = [("Hello, PySpark!",), ("PySpark is great in today's world",),
		("Spark DataFrames are powerful in python to work on",)]
df = spark.createDataFrame(data, ["sentence"])

# 创建自定义Python函数
def count_words(sentence):
	return len(sentence.split())


# 从自定义函数创建自定义项
count_udf = udf(count_words, IntegerType())

# 应用UDF计算每句话中的单词
df.withColumn("word_count", count_udf(df["sentence"])).show()

输出:

相关推荐
郑祎亦9 分钟前
Spring Boot 项目 myblog 整理
spring boot·后端·java-ee·maven·mybatis
本当迷ya22 分钟前
💖2025年不会Stream流被同事排挤了┭┮﹏┭┮(强烈建议实操)
后端·程序员
计算机毕设指导61 小时前
基于 SpringBoot 的作业管理系统【附源码】
java·vue.js·spring boot·后端·mysql·spring·intellij-idea
paopaokaka_luck2 小时前
[371]基于springboot的高校实习管理系统
java·spring boot·后端
捂月3 小时前
Spring Boot 深度解析:快速构建高效、现代化的 Web 应用程序
前端·spring boot·后端
瓜牛_gn3 小时前
依赖注入注解
java·后端·spring
Estar.Lee3 小时前
时间操作[取当前北京时间]免费API接口教程
android·网络·后端·网络协议·tcp/ip
喜欢猪猪3 小时前
Django:从入门到精通
后端·python·django
一个小坑货3 小时前
Cargo Rust 的包管理器
开发语言·后端·rust
bluebonnet274 小时前
【Rust练习】22.HashMap
开发语言·后端·rust