从CSV文件加载中删除标题

时间:2014-01-20 14:21:22

标签: hadoop apache-pig

我有一个采用以下格式的文件。

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(或任何其他方法)中是否有一种方法可以忽略所有不包含逗号的行?

2 个答案:

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