什么是用户定义函数(udf)?

用户定义函数(UDF)是由用户定义的函数,允许在用户环境中重用自定义逻辑。Databricks支持许多不同类型的udf,以支持分布式可扩展逻辑。本文介绍了udf的一些一般优点和局限性。

有关udf的更多信息,请参阅以下文章:

什么时候自定义逻辑不是UDF?

并不是所有的自定义函数都是严格意义上的udf。您可以使用SQL或Spark DataFrames安全地定义一系列Spark内置方法,并获得完全优化的行为。例如,下面的SQL和Python函数结合Spark内置方法将单位转换定义为可重用函数:

创建函数convert_f_to_c单位字符串临时返回返回情况下单位“F”然后临时-325/9其他的临时结束选择convert_f_to_c单位临时作为c_temptv_temp
defconvertFtoCunitColtempCol):pyspark.sql.functions进口返回unitCol= =“F”tempCol-325/9))否则tempColpyspark.sql.functions进口上校df_querydf选择convertFtoC上校“单元”),上校“临时”)))toDF“c_temp”显示df_query

要运行上述udf,您可以创建示例数据

哪些udf是最有效的?

udf可能会在代码执行中引入重要的处理瓶颈。Databricks为使用Apache Spark、SQL和Delta Lake语法编写的代码自动使用了许多不同的优化器。当udf引入自定义逻辑时,这些优化器不能围绕该自定义逻辑有效地计划任务。此外,在JVM外部执行的逻辑在数据序列化方面有额外的成本。

有些udf比其他udf更有效。在性能方面:

  • 内置函数将是最快的,因为Databricks优化器。

  • 在JVM (Scala, Java, Hive udf)中执行的代码将比Python udf更快。

  • Pandas udf使用Arrow来减少与Python udf相关的序列化成本。

  • 通常应该避免使用Python udf,但Python可以用作粘合代码,而不会降低性能。

    请注意

    在使用共享访问模式的集群上,Unity Catalog不支持Python UDF和UDAF(用户定义的聚合函数)。

类型

优化

执行环境

蜂巢UDF

没有

JVM

Python UDF

没有

Python

熊猫UDF

没有

Python(箭头)

Scala UDF

没有

JVM

火花SQL

是的

JVM

火花DataFrame

是的

JVM

什么时候应该使用UDF?

udf的一个主要好处是允许用户用熟悉的语言表达逻辑,减少了与重构代码相关的人力成本。对于特别查询、手动数据清理、探索性数据分析以及小型或中型数据集上的大多数操作,与udf相关的延迟开销成本不太可能超过与重构代码相关的成本。

对于ETL作业,流操作,对非常大的数据集的操作,或其他定期或连续执行的工作负载,重构逻辑以使用本机Apache Spark方法可以快速获得收益。

例如udf的示例数据

本文中的代码示例使用udf在摄氏度和华氏度之间转换温度。如果你想执行这些函数,你可以用下面的Python代码创建一个样本数据集:

进口numpy作为np进口熊猫作为pdFdfpdDataFramenp随机正常的552510000000),“临时”])Fdf“单元”“F”提供pdDataFramenp随机正常的101010000000),“临时”])提供“单元”“C”df火花createDataFramepdconcat([Fdf提供])样本裂缝分析1))df缓存()()dfcreateOrReplaceTempView“tv_temp”