什么是用户定义函数(udf)?
用户定义函数(UDF)是由用户定义的函数,允许在用户环境中重用自定义逻辑。Databricks支持许多不同类型的udf,以支持分布式可扩展逻辑。本文介绍了udf的一些一般优点和局限性。
有关udf的更多信息,请参阅以下文章:
什么时候自定义逻辑不是UDF?
并不是所有的自定义函数都是严格意义上的udf。您可以使用SQL或Spark DataFrames安全地定义一系列Spark内置方法,并获得完全优化的行为。例如,下面的SQL和Python函数结合Spark内置方法将单位转换定义为可重用函数:
创建函数convert_f_to_c(单位字符串,临时双)返回双返回情况下当单位=“F”然后(临时-32)*(5/9)其他的临时结束;选择convert_f_to_c(单位,临时)作为c_temp从tv_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可能会在代码执行中引入重要的处理瓶颈。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进口熊猫作为pdFdf=pd.DataFrame(np.随机.正常的(55,25,10000000),列=[“临时”])Fdf[“单元”]=“F”提供=pd.DataFrame(np.随机.正常的(10,10,10000000),列=[“临时”])提供[“单元”]=“C”df=火花.createDataFrame(pd.concat([Fdf,提供]).样本(裂缝分析=1))df.缓存().数()df.createOrReplaceTempView(“tv_temp”)