0

我编码的配置单元 UDTF 工作正常,只要指定的输出列数是两个。但是此刻,我将其更改为三个并重新部署,它显示以下错误消息。

失败:SemanticException [错误 10083]:AS 子句中提供的别名数与 UDTF 预期的 2 个别名输出的列数不匹配,但得到了 3 个

有什么理由吗?

这是我在初始化方法中使用的代码块。

List<String> fieldNames = new ArrayList<String>(3);
List<ObjectInspector> fieldOIs = new ArrayList<ObjectInspector>(3);
fieldNames.add("word");
fieldNames.add("cnt");
fieldNames.add("ext");

fieldOIs.add(PrimitiveObjectInspectorFactory.javaStringObjectInspector);
fieldOIs.add(PrimitiveObjectInspectorFactory.javaIntObjectInspector);
fieldOIs.add(PrimitiveObjectInspectorFactory.javaIntObjectInspector);

return ObjectInspectorFactory.getStandardStructObjectInspector(fieldNames, fieldOIs);

这是过程方法中的前向语句

forward(new Object[] { "abcdef", Integer.valueOf(123), Integer.valueOf(123)});

任何帮助表示赞赏。

4

1 回答 1

2

解决方案是关闭当前的 hive CLI 会话,打开另一个 hive 会话并部署 jar 以使 initialize() 中的新更改生效。

要使更改生效,

initialize() 方法 --> 重新启动一个新的 hive CLI 会话并重新部署 jar

process() 方法-> 在同一会话中重新部署 jar 有效!

似乎 initialize() 方法仅在第一次部署 jar 期间加载每个会话,而每次在同一会话中重新部署 jar 时都会重新加载 process() 方法。

由于有关列数的信息存在于 initialize() 方法中,因此它不适用于同一会话中的任何数量的重新部署。当我关闭会话并在部署 jar 文件之前开始新的会话时,它起作用了。

于 2015-07-20T19:26:35.253 回答