Hive UDTF 不接受超过 2 列的输出
Posted
技术标签:
【中文标题】Hive UDTF 不接受超过 2 列的输出【英文标题】:Hive UDTF not accepting more than 2 columns output 【发布时间】:2015-07-20 01:34:02 【问题描述】:我编写的 hive UDTF 工作正常,只要指定的输出列数为 2。但是此刻,我将其更改为三个并重新部署,它会显示以下错误消息。
失败: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));
任何帮助表示赞赏。
【问题讨论】:
【参考方案1】:解决方法是关闭当前的 hive CLI session,打开另一个 hive session 并部署 jar 以使 initialize() 中的新更改生效。
为了使更改生效,
initialize() 方法 --> 重新启动一个新的 hive CLI 会话并重新部署 jar
process() 方法 --> 在同一会话中重新部署 jar 有效!
initialize() 方法似乎仅在首次部署 jar 时在每个会话中加载,而 process() 方法在每次在同一会话中重新部署 jar 时都会重新加载。
由于有关列数的信息存在于 initialize() 方法中,因此它不适用于同一会话中的任何数量的重新部署。当我在部署 jar 文件之前关闭会话并开始新的会话时,它起作用了。
【讨论】:
以上是关于Hive UDTF 不接受超过 2 列的输出的主要内容,如果未能解决你的问题,请参考以下文章