如何在 PIG latin 中对平面文件的所有列使用子字符串操作

How to use substring operation on all the columns of a flat file in PIG latin

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

注意点:不知道列数。

提前致谢。

将数据作为单个 field.Write UDF 加载并将字段作为 parameter.In 您的 UDF 使用循环遍历所有列,方法是根据分隔符拆分字段并限制所有列到所需的 length.Reconstruct 行和 return 单个 field.The 下面的脚本和 UDF 应该让你走上正确的轨道。

将 UDF 编译成一个 jar 并在您的 pig 脚本中注册该 jar。

小猪

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
  }
}