Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jsp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Hive 如何在配置单元中为数组中的每个元素调用UDF?_Hive_Hiveql - Fatal编程技术网

Hive 如何在配置单元中为数组中的每个元素调用UDF?

Hive 如何在配置单元中为数组中的每个元素调用UDF?,hive,hiveql,Hive,Hiveql,我有一个配置单元表,其中一列是字符串数组。我还有一组自定义UDF,用于处理单个字符串。我想让hive对数组中的每个元素执行自定义UDF,然后将结果作为修改后的数组返回 这似乎是一个简单的要求,但我无法找到一个简单的解决方案。我发现了两种可能性,没有一种是简单的: 使用explode和侧向视图执行配置单元SQL操作,然后调用UDF,然后聚合回数组。这似乎太过分了,因为我看不到它在少于2个mapreduce作业中执行(但我可能在这里错了) 将我的每个UDF实现为GenericUDF,该UDF随数组一

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

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

  • 使用explode和侧向视图执行配置单元SQL操作,然后调用UDF,然后聚合回数组。这似乎太过分了,因为我看不到它在少于2个mapreduce作业中执行(但我可能在这里错了)
  • 将我的每个UDF实现为GenericUDF,该UDF随数组一起提供,处理其中的每个元素并再次返回数组。这需要更多的发展

  • 有什么简单的方法可以做到这一点吗?

    如果没有更多的自定义UDF代码,或者像你说的那样,需要更多的MR作业,我就无法做到这一点


    但我建议可能的第三种选择——编写一个带有两个参数的GenericUDF:数组和另一个UDF的类名。实例化并通过反射调用UDF,将数组中的所有内容传递给它,然后返回结果数组。这可能有点难写,但至少你不必像你提到的那样重写所有现有的自定义项。

    选择(1)对我来说似乎是合理的。您希望避免2个mapreduce作业的原因是什么?您希望在尽可能少的mapreduce作业中执行查询,以将IO减少到最小。这就是慢速查询和快速查询之间的区别。是的,我知道2>1。我的问题是,为这个特定的案例重写您的UDF是否比简单地等待一个额外的MR工作更有效?如果第二份工作需要1分钟怎么办?嗯,我碰巧对我的数据有足够的了解,知道一份mapreduce工作与两份会有很大的不同。对于一般情况,是的,可能没有必要实现自定义UDF。我申请将此内置支持添加到Hive中。是的,这听起来类似于UDF Hive已经拥有的java_方法。我也在想这个,但并不太激动。最后,这可能是三种方法中最简单的一种。我成功地制作了UDF,它就像一个符咒。这不太难做到。我只做了一个区别:我使用了hive的FunctionRegistry中函数的符号名,而不是UDF类名。这样对我来说更简洁一点。