用户定义函数(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_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可能在代码执行中引入大量的处理瓶颈。砖使用许多不同的优化器自动编写的代码,包括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=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”)