gpt4 book ai didi

hadoop - Hive UDF 文本到数组

转载 作者:可可西里 更新时间:2023-11-01 14:42:17 28 4
gpt4 key购买 nike

我正在尝试为 Hive 创建一些 UDF,它为我提供了比已经提供的功能更多的功能 split()功能。

import org.apache.hadoop.hive.ql.exec.UDF;
import org.apache.hadoop.io.Text;

public class LowerCase extends UDF {

public Text evaluate(final Text text) {
return new Text(stemWord(text.toString()));
}

/**
* Stems words to normal form.
*
* @param word
* @return Stemmed word.
*/
private String stemWord(String word) {
word = word.toLowerCase();
// Remove special characters
// Porter stemmer
// ...
return word;
}
}

这在 Hive 中工作。我将此类导出到一个 jar 文件中。然后我将它加载到 Hive 中

add jar /path/to/myJar.jar;

并使用

创建一个函数

create temporary function lower_case as 'LowerCase';

我有一个表,其中有一个字符串字段。那么声明是:

select lower_case(text) from documents;

但现在我想创建一个返回数组的函数(例如 split 所做的)。

import java.util.ArrayList;
import java.util.List;
import java.util.StringTokenizer;

import org.apache.hadoop.hive.ql.exec.UDF;
import org.apache.hadoop.io.Text;

public class WordSplit extends UDF {

public Text[] evaluate(final Text text) {
List<Text> splitList = new ArrayList<>();

StringTokenizer tokenizer = new StringTokenizer(text.toString());

while (tokenizer.hasMoreElements()) {
Text word = new Text(stemWord((String) tokenizer.nextElement()));

splitList.add(word);
}

return splitList.toArray(new Text[splitList.size()]);
}

/**
* Stems words to normal form.
*
* @param word
* @return Stemmed word.
*/
private String stemWord(String word) {
word = word.toLowerCase();
// Remove special characters
// Porter stemmer
// ...
return word;
}
}

不幸的是,如果我执行与上面提到的完全相同的加载过程,此功能将不起作用。我收到以下错误:

FAILED: SemanticException java.lang.IllegalArgumentException: Error: name expected at the position 7 of 'struct<>' but '>' is found.

由于我没有找到任何文档提到这种转换,我希望你能给我一些建议!

最佳答案

实际上,“UDF”接口(interface)确实支持返回一个数组。

返回ArrayList<Text>甚至 ArrayList<String>而不是 Text[]

您的代码应如下所示:

import java.util.ArrayList;
import java.util.List;
import java.util.StringTokenizer;

import org.apache.hadoop.hive.ql.exec.UDF;
import org.apache.hadoop.io.Text;

public class WordSplit extends UDF {

public ArrayList<String> evaluate(final Text text) {
ArrayList<String> splitList = new ArrayList<String>();

StringTokenizer tokenizer = new StringTokenizer(text.toString());

while (tokenizer.hasMoreElements()) {
String word = stemWord((String) tokenizer.nextElement());
splitList.add(word);
}
return splitList;
}

/**
* Stems words to normal form.
*
* @param word
* @return Stemmed word.
*/
private String stemWord(String word) {
word = word.toLowerCase();
return word;
}
}

关于hadoop - Hive UDF 文本到数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17137194/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com