PysparkNote105---udf的使用

本文介绍了如何在PySpark中使用UDF进行数据构造,包括基本的使用方法,如函数式定义和lambda表达式,以及如何利用pyspark优化性能,如增加内存和分区。通过实例展示了如何创建IntegerType和StringType的UDF,并应用到数据列转换上。
摘要由CSDN通过智能技术生成

Intro

    pyspark udf的使用

数据构造

from pyspark.sql import SparkSession
from pyspark.sql import functions as F
from pyspark.sql.types import DoubleType,IntegerType,StringType

def get_or_create(app_name):
    spark = (
        SparkSession.builder.appName(app_name)
        .config("spark.driver.maxResultSize", "10g")
        .config("spark.sql.execution.arrow.enabled", "true")
        .config("spark.dynamicAllocation.enabled", "false")
        .config("spark.sql.crossJoin.enabled", "true")
        .config("spark.kryoserializer.buffer.max", "512m")
        .getOrCreate()
    )
    spark.sparkContext.setLogLevel("ERROR")
    return spark
import pandas as pd
spark = get_or_create("spark")
df = pd.DataFrame({"name": ["A", "B"],"name1": ["A", "B"], "age": [10, 20]})
df_spark = spark.createDataFrame(df)
df_spark.show(truncate=False)
+----+-----+---+
|name|name1|age|
+----+-----+---+
|A   |A    |10 |
|B   |B    |20 |
+----+-----+---+

udf

用法一

@F.udf(returnType=IntegerType())
def test(col1):
    res = col1*2
    return res
df_spark.withColumn('new_age',test("age")).show()
+----+-----+---+-------+
|name|name1|age|new_age|
+----+-----+---+-------+
|   A|    A| 10|     20|
|   B|    B| 20|     40|
+----+-----+---+-------+

用法二

test1 = F.udf(lambda age:age*2,IntegerType())
df_spark.withColumn('new_age',test1("age")).show()
+----+-----+---+-------+
|name|name1|age|new_age|
+----+-----+---+-------+
|   A|    A| 10|     20|
|   B|    B| 20|     40|
+----+-----+---+-------+
test2 = F.udf(lambda name,name1:name+name1,StringType())
df_spark.withColumn('new_name',test2("name","name1")).show()
+----+-----+---+--------+
|name|name1|age|new_name|
+----+-----+---+--------+
|   A|    A| 10|      AA|
|   B|    B| 20|      BB|
+----+-----+---+--------+

pandas_udf 有空要再研究下,pyspark优化的一些操作,多了解些。目前就是暴力,慢就加分区,加内存

                                2022-08-05 于南京市江宁区九龙湖

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值