【问题标题】:How to invoke UDF for each element in an array in hive?如何为配置单元中的数组中的每个元素调用 UDF?
【发布时间】:2014-12-31 14:32:45
【问题描述】:

我有一个配置单元表,其中一列是字符串数组。我还有一组自定义 UDF 来操作单个字符串。我想让 hive 对数组中的每个元素执行我的自定义 UDF,然后将结果作为修改后的数组返回。

这似乎是一个简单的要求,但我无法找到一个简单的解决方案。我发现了两种可能性,它们都不简单:

  1. 使用分解视图和横向视图执行 Hive SQL 体操,然后调用 UDF,然后聚合回数组。这似乎太过分了,因为我没有看到它在少于 2 个 mapreduce 作业中执行(但我在这里可能是错的)。
  2. 将我的每个 UDF 实现为 GenericUDF,它提供一个数组,处理其中的每个元素并再次返回一个数组。这需要更多的开发。

有什么简单的方法吗?

【问题讨论】:

  • 选择 (1) 对我来说似乎是合理的。您是否有理由要避免 2 个 mapreduce 作业?
  • 您希望在尽可能少的 mapreduce 作业中执行查询,以将 IO 降至最低。这就是慢查询和快查询之间的区别。
  • 是的,我知道 2 > 1. 我的问题是为这种特定情况重写您的 UDF 比简单地等待 1 个额外的 MR 作业更有效吗?如果第二份工作需要 1 分钟怎么办?
  • 好吧,我碰巧对我的数据有足够的了解,知道一个 mapreduce 作业与两个作业会产生很大的不同。对于一般情况,是的,可能没有必要实现自定义 UDFS。
  • 我提交了 issues.apache.org/jira/browse/HIVE-13993 以向 Hive 添加对此的内置支持。

标签: hive hiveql


【解决方案1】:

如果没有更多自定义 UDF 代码,或者如您所说,需要更多 MR 作业,我将无法做到这一点。

但我建议可能的第三个选项 - 编写一个接受两个参数的 GenericUDF:一个数组和另一个 UDF 的类名。通过反射实例化并调用 UDF,将数组中的所有内容传递给它,并返回结果数组。这可能有点难以编写,但至少您不必重写所有现有的 UDF,正如您所提到的。

【讨论】:

  • 是的,这听起来类似于 java_method UDF hive 已经有。我也想过这个问题,但并没有太激动。最后,这实际上可能是三者中最简单的。
  • 我成功地制作了 UDF,它就像一个魅力。拉下来并不难。我只做了一个区别:我没有使用 UDF 类名,而是使用了 hive 的 FunctionRegistry 中的函数符号名。这样对我来说更简洁一些。
猜你喜欢
  • 1970-01-01
  • 2022-12-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-09
  • 2014-06-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多