gpt4 book ai didi

java - 如何在PIG拉丁语的平面文件的所有列上使用子字符串操作

转载 作者:行者123 更新时间:2023-12-02 20:48:29 26 4
gpt4 key购买 nike

我需要使用PIG将平面文件各列中所有值的长度限制为10000。我在少数列上使用了子字符串操作,但无法找出所有列的方法。

需要指出的一点:对列数一无所知。

提前致谢。

最佳答案

将数据作为单个字段加载。编写UDF并将该字段作为参数传递。在UDF中,使用循环通过根据定界符拆分字段并将所有列限制为所需的长度以遍历所有列。重新构造行并返回下面的脚本和UDF应该可以让您走上正确的道路。

将UDF编译到一个jar中,然后将该jar注册到您的Pig脚本中。

pig

REGISTER \path\TrimCols.jar;

DEFINE TrimCols com.company.myproject.TrimCols();

A = LOAD '/path/file.txt' USING TextLoader() AS (line:chararray);
B = FOREACH A GENERATE TrimCols(line);
DUMP B;

UDF
import java.io.IOException;
import org.apache.pig.EvalFunc;
import org.apache.pig.data.Tuple;

public class TrimCols extends EvalFunc<String> {

public String exec(Tuple input) throws IOException {

if (input != null && input.size() != 0)
{
String line = input.toString();
String [] items = line.split(","); -- Use whatever delimiter your columns are separated by.
try
{
StringBuilder s = new StringBuilder();
for(int i=0;i < items.length;i++)
{
if(items[i] != null && !items[i].toString().isEmpty() && items[i].Length > 10000)
s.append(items[i].substring(0,10000));
else
s.append(items[i]);
if(i < items.length-1)
s.append(","); -- Add the delimiter again,You will need this to split the trimmed cols in your pig script
}
return s.toString();

} catch (Exception e)
{
return line;
}
}
else
return "INPUT_NULL"; -- return whatever you want,so that you can handle this in your pigscript
}
}

关于java - 如何在PIG拉丁语的平面文件的所有列上使用子字符串操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46933077/

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