如何在 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
}
}
我需要使用 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
}
}