2015-03-20 3 views
0

У меня есть требование в hadoop, где мне нужно загрузить набор файлов журналов в таблицу hive и запросить на нем.Загрузка LOG FILE В HIVE ТАБЛИЦА

Файл журнала Sample выглядит,


# Comment 

# Comment 

01 record1 record2 record3 record4 

02 record1 record2 record3 record4 

03 record1 record2 record3 record4 

# Comment 

# comment 

Я хочу, чтобы устранить эту # строку комментария, которая начинается с # в каждой строке.

Фактический контент, который я хочу загрузить, ограничен пространством и структурирован.

Любое решение/предложение о том, как загрузить данные, исключив строки комментариев?

Пожалуйста, помогите!

ответ

0

Вы можете очистить файлы с помощью команды Unix:

, если поля не содержат #, используйте Grep -v '#' filename.log> stripped.log еще смотреть с помощью команды патч в SED '/^#/d' filename.log> stripped.log, это удалит все строки, начинающиеся с #

Для очистки огромных файлов UNIX-команды не возобновляются. Вы должны очистить свои данные с помощью программы MapReduce.

Вы можете выполнить операцию очистки в каждой строке, а затем вставить ее в таблицу улей для запросов. PFA карта уменьшает программу для очистки комментариев от файлов данных.

Hadoop баночка CleanData.jar HDFS расположение данных HDFS Hive таблица папки NameNode имя хоста: PortNo

Пример карты сократить программу для очистки данных

public class CleanData { 

    public static class Map extends Mapper<LongWritable, Text, Text,NullWritable> { 


     @Override 
     public void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException { 

      NullWritable nullWritable = NullWritable.get(); 
      String line = value.toString(); 
      if(line.substring(0, 1).equals("#")){} 
      else 
      context.write(value,nullWritable);     
     } 
    } 






    public static void main(String[] args) throws Exception { 

     Configuration conf=new Configuration(); 
     conf.set("fs.default.name", args[2]); 
     Job job = new Job(conf); 
     job.setJarByClass(CleanData.class); 
     job.setJobName("wordcount"); 
     FileInputFormat.addInputPath(job, new Path(args[0])); 
     FileOutputFormat.setOutputPath(job, new Path(args[1])); 
     job.setMapperClass(Map.class); 
     job.setOutputKeyClass(Text.class); 
     job.setOutputValueClass(NullWritable.class); 
     job.waitForCompletion(true);   

    } 




} 
0

Вы можете указать serde при создании улья таблицы , Встроенный RegexSerde будет служить вашей цели.

CREATE TABLE regex_log_table (
    id STRING , 
    val1 STRING, 
    val2 STRING, 
    val3 STRING, 
    val4 STRING 
) 
ROW FORMAT SERDE 'org.apache.hadoop.hive.contrib.serde2.RegexSerDe' 
WITH SERDEPROPERTIES (
"input.regex" = "(^[0-9]+) (.+) (.+) (.+) (.+)$", 
"output.format.string" = "%1$s %2$s %3$s %4$s %5$s" 
) 
STORED AS TEXTFILE; 

Вы можете написать обычную serde, если вам нужна более индивидуальная загрузка данных.

Ссылка: http://shout.setfive.com/2013/12/10/hive-how-to-write-a-custom-serde-class/

Смежные вопросы