PySpark UDF使用详解及代码示例

本文详细介绍了如何在PySpark中使用UDF(用户定义函数),并给出了计算两数之和的代码示例,适用于处理包含NULL值的情况。

案例一

在hive或spark计算中需要注意两数之和或之差如果其中有一个为null,那么结果等于null,所以提供以下udf

自定义函数求两数之和

def diy_add(a, b):
    r = None
    if a is None:
        if b is None:
            return r
        else:
            return b
    else:
        if b is None:
            return a
        else:
            return a + b


spark.udf.register("diy_add", lambda x, y: diy_add(x, y))

# 两个参数均为数值类型
spark.sql("select diy_add(1, 4)")
5
# 两个参数一个数值类型,一个null
spark.sql("select diy_add(1, 4/0)")
1
spark.sql("sel
<think>我们正在讨论PySpark中的`withColumn`函数使用方法。根据引用内容,`withColumn`主要有两个用途:更新现有列的值或添加新列。其基本语法是`df.withColumn(colName, col)`,其中`colName`是列名(若存在则更新,否则添加),`col`是一个Column类型的表达式。 引用中提供的例子: - 引用[1]:`df3 = df.withColumn("salary", col("salary")*100)` 将现有列"salary"的值乘以100。 - 引用[3]:使用自定义UDF(用户定义函数)来创建新列:`dfs = df.withColumn("A+B", udf_function("A","B"))`,这里通过UDF将两列相加。 此外,引用[4]提到可以使用条件表达式(例如`when`和`otherwise`)来根据条件设置列的值。 因此,我们可以总结`withColumn`的几种常见用法: 1. 使用列表达式更新或添加列(包括算术运算、函数等)。 2. 结合UDF进行复杂操作。 3. 使用条件表达式(如`when`)进行条件赋值。 下面我将详细解释这些用法,并给出示例代码。 </think> ### PySpark中`withColumn`函数使用方法详解 `withColumn()`是PySpark DataFrame的核心函数,用于添加新列或更新现有列。其语法为: ```python df.withColumn(colName: str, col: Column) → DataFrame ``` **参数说明**: - `colName`:新列名(若已存在则为更新) - `col`:`Column`类型的表达式(不可直接使用Python原生类型) --- #### 一、基础用法示例 1. **创建新列** ```python from pyspark.sql.functions import col # 添加新列 "bonus" (值为salary的10%) df_new = df.withColumn("bonus", col("salary") * 0.1) ``` 2. **更新现有列** ```python # 将salary列值翻倍(覆盖原列) df_updated = df.withColumn("salary", col("salary") * 2) ``` --- #### 二、进阶用法 1. **条件表达式**(结合`when`) ```python from pyspark.sql.functions import when # 根据条件赋值(类似SQL的CASE WHEN) df = df.withColumn("grade", when(col("score") >= 90, "A") .when(col("score") >= 80, "B") .otherwise("C") ) ``` 2. **使用UDF(自定义函数)** ```python from pyspark.sql.functions import udf from pyspark.sql.types import StringType # 定义UDF:将姓名转为大写 def to_upper(name): return name.upper() # 注册UDF udf_upper = udf(to_upper, StringType()) # 应用UDF添加新列 df = df.withColumn("name_upper", udf_upper(col("name"))) ``` 3. **动态列名** ```python # 根据变量名创建列 column_name = "total" df = df.withColumn(column_name, col("price") * col("quantity")) ``` --- #### 三、注意事项 1. **不可变性**:Spark DataFrame不可变,`withColumn()`始终返回新DataFrame,需重新赋值[^1]。 2. **性能优化**:避免链式调用多个`withColumn()`,建议用`select()`批量操作以减少计算开销。 3. **类型安全**:表达式必须返回`Column`对象,直接使用Python值会报错。需用`lit()`包装常量: ```python from pyspark.sql.functions import lit df.withColumn("country", lit("China")) # 正确 ``` --- ### 参考代码模板 ```python from pyspark.sql import SparkSession from pyspark.sql.functions import col, when, lit spark = SparkSession.builder.appName("withColumn_example").getOrCreate() # 示例DataFrame data = [("Alice", 85), ("Bob", 72)] df = spark.createDataFrame(data, ["name", "score"]) # 综合操作:添加等级列 + 是否及格列 df_result = (df .withColumn("grade", when(col("score") >= 85, "A") .otherwise("B")) .withColumn("is_pass", when(col("score") >= 60, lit(True)) .otherwise(False)) ) df_result.show() ``` **输出**: ``` +-----+-----+-----+-------+ | name|score|grade|is_pass| +-----+-----+-----+-------+ |Alice| 85| A| true| | Bob| 72| B| true| +-----+-----+-----+-------+ ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值