假设我正在构建一个名为 StaticLookupUDF 的 UDF 类,它必须在构建期间从本地文件加载一些静态数据。
在这种情况下,我想确保我不会重复我需要的工作,因为我不想在每次调用 evaluate() 方法时重新加载静态数据。
显然每个映射器都使用它自己的 UDF 实例,但是是否为每个处理的记录生成一个新实例?
例如,映射器将处理 3 行。它是创建单个 StaticLookupUDF 并调用 evaluate() 3 次,还是为每个记录创建一个新的 StaticLookupUDF,并且每个实例仅调用一次 evaluate()?
如果第二个例子是真的,我应该用什么替代方式来构造它?
在文档中的任何地方都找不到这个,我打算查看代码,但我想我会同时问问这里的聪明人。
最佳答案
仍然不能完全确定这一点,但我通过使用静态延迟值根据需要加载数据来解决这个问题。
这样一来,每个映射器就有一个静态值实例。因此,如果您正在读取数据集并且有 6 个 map task ,那么您将读取数据 6 次。不理想,但比每条记录一次要好。
关于hadoop - hive 是否为每条记录实例化一个新的 UDF 对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7839881/