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

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

请注意

并不是所有形式的udf在砖上的所有执行环境。

udf的更多信息,请参见下面的文章:

定义自定义逻辑没有序列化处罚

砖继承的UDF从Apache引发行为,包括效率限制在许多类型的UDF。看到udf是最有效的?

您可以安全地模块化代码而不用担心与udf相关的潜在效率的权衡。要做到这一点,你必须定义逻辑作为一系列的火花内置方法使用SQL或引发DataFrames。例如,下面的SQL和Python函数结合火花内置方法定义一个单位转换为一个可重用的功能:

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

运行上面的udf,您可以创建示例数据

udf是最有效的?

udf可能在代码执行中引入大量的处理瓶颈。砖使用许多不同的优化器自动编写的代码,包括Apache火花,SQL和三角洲湖语法。由udf引入自定义逻辑时,这些优化器不能够有效地计划任务在这个自定义的逻辑。此外,在JVM执行的逻辑额外成本数据序列化。

请注意

砖优化使用光子如果使用Photon-enabled计算许多功能。只有函数链在一起引发SQL DataFrame命令可以优化的光子。

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

  • 内建函数将最快,因为砖优化器。

  • 在JVM中执行的代码(Scala、Java、蜂巢udf)将快于Python udf。

  • 熊猫udf使用箭头来减少序列化成本与Python udf。

  • Python udf适合过程逻辑,但是应该避免生产ETL工作负载在大型数据集。

请注意

Python UDF和UDAF(用户定义的聚合函数)不支持集群统一目录,使用共享访问模式。

类型

优化

执行环境

蜂巢UDF

没有

JVM

Python UDF

没有

Python

熊猫UDF

没有

Python(箭头)

Scala UDF

没有

JVM

火花SQL

是的

JVM(光子)

火花DataFrame

是的

JVM(光子)

你什么时候应该使用UDF ?

udf的一个主要好处是,他们允许用户用熟悉的语言表达逻辑,减少了人力成本与重构代码。对于临时查询,手工数据清理,探索性数据分析,和大多数中小数据集上的操作,延迟与udf相关开销成本不可能大于成本与重构代码。

对ETL作业流操作,操作非常大的数据集,或其他工作负载执行定期或连续,重构逻辑使用本机Apache火花方法快速支付股息。

示例数据例如udf

本文中的代码示例使用udf转换温度摄氏和华氏之间。如果您希望执行这些功能,您可以创建一个示例数据集与Python代码如下:

进口numpy作为np进口熊猫作为pdFdf=pdDataFrame(np随机正常的(55,25,10000000),=(“临时”])Fdf(“单元”]=“F”提供=pdDataFrame(np随机正常的(10,10,10000000),=(“临时”])提供(“单元”]=“C”df=火花createDataFrame(pdconcat([Fdf,提供])样本(裂缝分析=1))df缓存()()dfcreateOrReplaceTempView(“tv_temp”)