- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
这是关于 Hive 通用 UDTF。
该程序的目的是以一个字符串列作为输入,在按空格分割输入列(字符串)后输出应为多行。已生成 jar 文件并将该 jar 添加到 hive shell 中,还为类名创建了临时函数。调用函数时出现数组索引越界错误。
代码:
package com.suba.customHiveUdfs;
import java.util.ArrayList;
import org.apache.hadoop.hive.ql.exec.UDFArgumentException;
import org.apache.hadoop.hive.ql.metadata.HiveException;
import org.apache.hadoop.hive.ql.udf.generic.GenericUDTF;
import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspector;
import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspectorFactory;
import org.apache.hadoop.hive.serde2.objectinspector.PrimitiveObjectInspector;
import org.apache.hadoop.hive.serde2.objectinspector.StructObjectInspector;
import org.apache.hadoop.hive.serde2.objectinspector.primitive.PrimitiveObjectInspectorFactory;
public class MyUdtf extends GenericUDTF {
ArrayList<String> colList = new ArrayList<>(1);
ArrayList<ObjectInspector> oiList = new ArrayList<>(1);
PrimitiveObjectInspector poi = null;
@Override
public StructObjectInspector initialize(ObjectInspector[] argOIs) throws UDFArgumentException {
// TODO Auto-generated method stub
if (argOIs.length > 1) {
throw new UDFArgumentException("invalid argument");
}
if (argOIs[0].getCategory() != ObjectInspector.Category.PRIMITIVE) {
throw new UDFArgumentException("primitive expected");
}
if (((PrimitiveObjectInspector) argOIs[0])
.getPrimitiveCategory() != PrimitiveObjectInspector.PrimitiveCategory.STRING) {
throw new UDFArgumentException("not string type");
}
poi = (PrimitiveObjectInspector) argOIs[0];
colList.add("name");
oiList.add(PrimitiveObjectInspectorFactory.javaStringObjectInspector);
return ObjectInspectorFactory.getStandardStructObjectInspector(colList, oiList);
}
@Override
public void process(Object[] arg0) throws HiveException {
String name = ((PrimitiveObjectInspector) poi).getPrimitiveJavaObject(arg0[0]).toString();
String[] tokens = name.split(" ");
for (String x : tokens) {
Object[] objects = new Object[] { x };
forward(objects);
}
}
@Override
public void close() throws HiveException {
}
}
错误消息如下所示:获取数组索引越界错误。
Caused by: java.lang.ArrayIndexOutOfBoundsException: 1
at java.util.Arrays$ArrayList.get(Arrays.java:3841)
at org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe.serialize(LazySimpleSerDe.java:417)
at org.apache.hadoop.hive.ql.exec.FileSinkOperator.processOp(FileSinkOperator.java:592)
at org.apache.hadoop.hive.ql.exec.Operator.forward(Operator.java:796)
at org.apache.hadoop.hive.ql.exec.UDTFOperator.forwardUDTFOutput(UDTFOperator.java:125)
at org.apache.hadoop.hive.ql.udf.generic.UDTFCollector.collect(UDTFCollector.java:45)
at org.apache.hadoop.hive.ql.udf.generic.GenericUDTF.forward(GenericUDTF.java:107)
at com.suba.customHiveUdfs.MyUdtf.process(MyUdtf.java:61)
at org.apache.hadoop.hive.ql.exec.UDTFOperator.processOp(UDTFOperator.java:108)
at org.apache.hadoop.hive.ql.exec.Operator.forward(Operator.java:796)
at org.apache.hadoop.hive.ql.exec.SelectOperator.processOp(SelectOperator.java:87)
at org.apache.hadoop.hive.ql.exec.Operator.forward(Operator.java:796)
at org.apache.hadoop.hive.ql.exec.TableScanOperator.processOp(TableScanOperator.java:92)
at org.apache.hadoop.hive.ql.exec.Operator.forward(Operator.java:796)
at org.apache.hadoop.hive.ql.exec.MapOperator.process(MapOperator.java:539)
... 9 more
最佳答案
一旦更改或在流程方法内循环为..,问题就解决了
for (String x : tokens) {
String string[] = new String[] { x };
forward(string);
}
关于java - Hive 通用 UDTF 因数组索引越界错误而失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61280608/
我根据教程制作了自己的 UDTF 函数,并将 jar 加载到配置单元中。现在我想创建自己的函数来调用 UDTF。 statement.executeUpdate("ADD JAR /home/hfu/
我希望这个问题的答案是“否”,但无论如何…… 我有一个包含键和数组的表。典型的行可能如下所示: 98c28560-4b48-11e3-9c12-07373d47725c segment-a,segme
这是关于 Hive 通用 UDTF。 该程序的目的是以一个字符串列作为输入,在按空格分割输入列(字符串)后输出应为多行。已生成 jar 文件并将该 jar 添加到 hive shell 中,还为类名创
您好,我是 Netezza 的新手,我被要求开发自定义 Java 函数并交付 API。 我的问题是我是否可以根据给定的要求提供解决方案。这是要求。 我有一个表,我们将其命名为 Table1。我必须按行
我创建了 Hive 自定义 UDTF。我的新 UDTF 根据输入的 2 列返回新的 3 列。 但是,我无法使用生成的值进行任何 INSERT 操作。例如, INSERT OVERWRITE DIREC
Hive UDTF 单独处理每一行并转发每一行的输出。我需要对所有函数输出进行一些操作。有没有办法在处理完所有行后将所有函数输出转发一次? 提前致谢! 最佳答案 是的,这种方式存在。 要对 UDF 的
我编写的配置单元 UDTF 可以正常工作,只要指定的输出列数为 2。但是此刻,我将其更改为三个并重新部署,它显示以下错误消息。 失败:SemanticException [错误 10083]:AS 子
我是 Hive UDTF 的新手。我有一个要求,我必须在 UDTF 中将字符串值作为 Paratmeter 传递,并且返回的 Column 应该是 ArrayList。 我写了下面的代码: publi
已解决: 原来是我的UDTF出错了。我找到了一个修复程序,但我不太明白为什么它会起作用。当初我实现UDTF的时候,Eclipse提示initialize is deprecated。但是如果我跳过它就
Java UDFs return a scalar result. Java UDTFs are not currently supported. reference 也就是说,我创建了一个 Java
任何人都可以给我一个用 scala 编写的返回多行并将其用作 SparkSQL 中的 UDF 的示例 UDTF(例如;explode)吗? 表:表1 +------+----------+------
我是一名优秀的程序员,十分优秀!