希望你们都做得很好。
再次请求您的帮助,以了解一个非常小的概念,继续混淆我。
假设我有一个数据块笔记本,只有几个单元格。在单元格1中,我有一个小的python函数
from dateutil import tz
def getCurTsZn(z):
tz = tz.gettz(z)
ts = datetime.now(tz)
return ts
现在这个函数在后续的单元格中被调用,比如在普通的python/pyspark代码中。以下是我的一些问题。
1.函数是用户定义的函数吗?或者只有以here编写的函数才被认为是Spark/Databricks中的UDF。
1.这个功能在内部是如何工作的?当在后续单元格中调用python代码时,我读到一些关于数据进入代码并导致一些性能问题的信息?
1.我读到UDF是黑盒,这会导致优化器将其优化限制在UDF之前和UDF之后。即使是这样简单的函数(未注册)也会像黑盒一样阻碍优化吗?
1.我知道这个函数需要注册才能在spark.sql("SELECT getCurTsZn("some zone")")
中使用,但是如果不需要,注册真的有区别吗?看了linked的文章。但不看Spark级别优化的函数.只是简单的函数,如上面提到的。
1.矢量化的Python UDF在哪里出现?我知道矢量化的python udf可以在多行而不是单行上工作。那么,创建一个函数并向其传递一个嵌套框架并对其进行操作是否就构成了一个向量化函数?我希望有一个更好的理解与您的帮助下的基本知识。谢谢你,干杯...
1条答案
按热度按时间drnojrws1#
在你声明/注册这个函数为UDF之前,它将只在驱动节点上作为一个普通的Python函数执行。Databricks将单独的Python REPL附加到每个notebook,每个单元格都在该REPL的上下文中进行评估。
只有当你声明/注册函数为UDF时,它才会开始在执行器节点上执行。正如你提到的,有“正常”和矢量化的UDF。这两种类型都有相同的问题--要处理的数据应该从JVM内存传输到Python解释器内存。矢量化的UDF具有更好的性能,主要是因为它们避免了必要的序列化,但开销仍然存在(参见博客文章1,2)。这两种UDF类型仍然被认为是黑盒,因为Spark不知道里面发生了什么,也不能对代码应用不同的优化。