我有一个采用以下格式的文件。
TIMESTAMP=Jan 20 10:22:43 2014
TYPE=text
BEGIN-FILE
value1,value2,value3,value4,value5,value6
value1,value2,value3,value4,value5,value6
value1,value2,value3,value4,value5,value6
END-FILE
我想将此文件加载到Hadoop中,遗憾的是,所有文件都包含我要删除的元信息行。 Pig(或任何其他方法)中是否有一种方法可以忽略所有不包含逗号的行?
答案 0 :(得分:2)
在Pig中,如果您只想将它们丢弃,可以使用FILTER
命令删除这些行。你可以用多种方式做到这一点;这里有几种可能性:
将整行加载到单个字段中,将无法在逗号上拆分的字段过滤掉为6个字段,然后将它们拆分出来以便在脚本中使用:
a = LOAD 'file' USING PigStorage('\n') AS (line:chararray);
b = FILTER a BY SIZE(STRSPLIT(line, ',', 6)) == 6;
c = FOREACH a GENERATE FLATTEN(STRSPLIT(line, ',', 6)) AS (/*put your schema here*/);
以逗号分隔文件加载,然后在第6个字段中丢弃任何带NULL的行:
a = LOAD 'file' USING PigStorage(',') AS (/*put your schema here*/);
b = FILTER a BY $5 IS NOT NULL;
答案 1 :(得分:0)
在MapReduce中,让映射器的第一行解析它正在读取的行。您可以使用自定义解析逻辑执行此操作,也可以利用预构建的代码(在本例中为CSV库)。
protected void map(LongWritable key, Text value, Context context) throws IOException {
String line = value.toString();
CSVParser parser = new au.com.bytecode.opencsv.CSVParser.CSVParser();
try {
parser.parseLine(line);
// do your other stuff
} catch (Exception e) {
// the line was not comma delimited, do nothing
}
}