擅长:python、mysql、java
<p><strong>进口</strong></p>
<p>是和否。Redshift在语句中重用udf执行环境(甚至可能在整个事务中,但我还没有测试过)。的确,每次在处理import语句时调用函数时都会处理import语句,cpython会快速检查模块是否已经导入,如果已经导入,则使用已经导入的模块。像这样的函数本地(后期)导入经常被用来解决循环依赖问题,因此必须执行。我还通过执行以下操作来解决udf中缺少全局初始化的问题:</p>
<p><code>if '_cache' not in globals():
import thing
globals()['_cache'] = thing.build_cache()
return _cache.get(arg)
</code></p>
<p>这不是我在任何地方都会做的事情,但这并不是一个通用代码。在</p>
<p>关于udf的执行环境,它显然是简单的细节,不应该过于依赖,但实际上它不太可能很快发生实质性的变化。不能保证任何特定进程的生存时间/它将处理多少行,但让它们尽可能长时间地存在是符合他们的利益的,因为cpython进程(和容器)的创建并不完全便宜——当然对于每一行来说都太重了。它们依赖lxc进行隔离,并为您提供了一个真正的(如果沙盒中有沙盒的话)linux环境来执行(如果您仔细考虑的话,这对于用户安装的本机扩展来说是非常必要的)。文件系统上甚至有一些文档可供那些想挖掘的人使用:)</p>
<p><strong>返回值</strong></p>
<p>虽然返回值的数据类型不能更改redshift(now?)支持参数和返回类型的<a href="http://docs.aws.amazon.com/redshift/latest/dg/udf-data-types.html" rel="nofollow noreferrer">ANYELEMENT</a>数据类型。正如前面的回答所描述的,它仍然需要一个消除歧义的类型化参数,因为仍然不支持返回类型多态性,但它至少为您省去了为每个要返回的类型创建单独函数的麻烦。在</p>