首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Hive : Hive不向UDF发送适当的参数。

Hive : Hive不向UDF发送适当的参数。
EN

Stack Overflow用户
提问于 2020-06-27 16:16:33
回答 1查看 258关注 0票数 2

这是我的蜂巢桌

代码语言:javascript
复制
CREATE TABLE `dum`(`val` map<string,array<string>>);
insert into dum select map('A',array('1','2','3'),'B',array('4','5','6'));

下面是它的样子

代码语言:javascript
复制
select * from dum;
{"A":["1","2","3"],"B":["4","5","6"]}

我正在尝试创建一个简单的UDF,它可以将上面映射的值中的所有项组合到一个列表中。这是我想要看到的

代码语言:javascript
复制
select modudf(val) from dum;
["1","2","3","4","5","6"]

所以我创造了

代码语言:javascript
复制
package some.package;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.hadoop.hive.ql.exec.UDF;
import org.apache.hadoop.hive.ql.udf.UDFType;
import java.util.ArrayList;

import java.util.List;
import java.util.Map;

@UDFType(deterministic = true)
public class CustomUDF extends UDF {

public List<String> evaluate(Map<String, String[]> inMap) {

            ArrayList<String> res = new ArrayList<String>();
                for(Map.Entry<String, String[]> ent : inMap.entrySet()){
                    for(String item : ent.getValue())
                        res.add(item);
            }
        return res;
   }
}

但当我试图调用它时

代码语言:javascript
复制
add jar /path/to/my/jar;
CREATE TEMPORARY FUNCTION modudf AS 'some.package.CustomUDF';
select modudf(val) from dum;

我得到了

代码语言:javascript
复制
FAILED: SemanticException [Error 10014]: Line 1:7 Wrong arguments 'val': No matching method for class some.package.CustomUDF with (map<string,array<string>>). Possible choices: _FUNC_(map<struct<>,struct<>>)

为什么hive认为我的UDF需要map<struct<>,struct<>>而不是map<string,array<string>>?我甚至尝试用Charsequence替换字符串,但是我得到了同样的错误。

请注意,根据文件

https://hive.apache.org/javadocs/r1.2.2/api/org/apache/hadoop/hive/ql/exec/UDF.html

我应该能够使用集合作为evaluate方法的输入。

我做错什么了?

更新

我还尝试了以下定义

代码语言:javascript
复制
public List<CharSequence> evaluate(Map<CharSequence, List<CharSequence>> inMap) {

        modLogger.info(inMap);
            ArrayList<CharSequence> res = new ArrayList<CharSequence>();
                for(Map.Entry<CharSequence, List<CharSequence>> ent : inMap.entrySet()){
                    for(CharSequence item : ent.getValue())
                        res.add(item);
            }
        return res;
   }
}

但我还是明白

代码语言:javascript
复制
hive> add jar /path/to/my/jar;
Added [/path/to/my/jar] to class path
Added resources: [/path/to/my/jar]
hive> CREATE TEMPORARY FUNCTION modudf AS 'some.package.CustomUDF';
hive> desc dum;
OK
val                     map<string,array<string>>
Time taken: 0.094 seconds, Fetched: 1 row(s)
hive> select val from dum;
Query ID = root_20200629170147_80b5248f-4519-4dae-a070-3c5185f742ea
Total jobs = 1
Launching Job 1 out of 1
Status: Running (Executing on YARN cluster with App id application_1593449512239_0001)

----------------------------------------------------------------------------------------------
        VERTICES      MODE        STATUS  TOTAL  COMPLETED  RUNNING  PENDING  FAILED  KILLED
----------------------------------------------------------------------------------------------
Map 1 .......... container     SUCCEEDED      1          1        0        0       0       0
----------------------------------------------------------------------------------------------
VERTICES: 01/01  [==========================>>] 100%  ELAPSED TIME: 6.12 s
----------------------------------------------------------------------------------------------
OK
{"A":["1","2","3"],"B":["4","5","6"]}
Time taken: 10.631 seconds, Fetched: 1 row(s)
hive> select modudf(val) from dum;
FAILED: SemanticException [Error 10014]: Line 1:7 Wrong arguments 'val': No matching method for class com.walmart.labs.search.sib.gcp.ModularTransformUDF with (map<string,array<string>>). Possible choices: _FUNC_(map<struct<>,array<struct<>>>)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-06-29 16:48:57

参见你发送的链接的引文

请注意,Hive数组在Hive中表示为列表。因此,数组列将作为列表传入。

所以您应该使用evaluate(Map<String, List<String>> inMap)签名而不是evaluate(Map<String, String[]> inMap)签名。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62612486

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档