2017-02-15 28 views
-1

Я пытаюсь написать PIG UDF для нижеприведенного входного файла образца, и я также указываю ожидаемый результат. Пожалуйста, помогите мне с шаблоном udf для того же или дайте мне знать, есть ли способ сделать это без UDF.Как написать PIG UDF для данных с разделителями вкладок и добавить метку времени с левой стороны?

моего образец ввод:

2014-01-23T08:12:09.259443 
    Device  Type   make         year 
-- ------------ --------- --------------------------------------- ------------- 
    desktop  commercial hp          2010 
    laptop  commercial Asus         2013 
    mobile  personal  Sony         2014 


2015-01-15T08:12:09.259443 
    Device  Type   make         year 
-- ------------ --------- --------------------------------------- ------------- 
    desktop  commercial hp          2015 
    laptop  commercial Asus         2016 
    mobile  personal  Sony         2013 

Я в основном нужен выход в качестве метки времени следует поля в разделителях отделенной моды, разделитель может быть «„“\ т», „|“. для этого экземпляра я использую «,» как разделитель.

Ожидаемый результат:

2014-01-23T08:12:09.259443, desktop, commercial, hp, 2010 
    2014-01-23T08:12:09.259443, laptop, commercial, Asus, 2013 
    2014-01-23T08:12:09.259443, mobile, personal, Sony, 2014 
    2015-01-15T08:12:09.259443, desktop, commercial, hp, 2015 
    2015-01-15T08:12:09.259443, laptop, commercial, Asus, 2016 
    2015-01-15T08:12:09.259443, mobile, personal, Sony, 2013 

Примечание: Я не могу сделать предварительную обработку, поскольку есть некоторые ТБ-файлов

+0

Что вы устали до сих пор? – bartektartanus

+0

@bartektartanus Спасибо, но я смог проанализировать его успешно. –

ответ

0

Это логика:

while(str.hasMoreTokens()){ 
      val=str.nextToken(); 
      Pattern pa = Pattern.compile("\\d+[-]\\d+[-]\\d+[T]\\d+[:]\\d+[:]\\d+(\\.\\d+)?"); 
      Matcher ma = pa.matcher(val); 
       boolean b = ma.matches(); 
       if(b==true) 
       { 
       timestamp=ma.group().substring(0, 19); 
       //System.out.println(timestamp); 
         } 

       else if(val.contains("Device") || val.contains("Type") || val.contains("make         ") || val.contains("year") || val.contains("--") || val.contains("------------") || val.contains("---------") || val.contains("---------------------------------------") || val.contains("-------------")) 
          { 

          } 
       else if(val!=timestamp){ 

       result=timestamp+val; 

          } 

       if(result.length()>0){ 

       System.out.println(result.substring(0)); 
          } 
     } 

Пожалуйста, дайте мне знайте, есть ли более эффективный/лучший способ сделать это. Спасибо!

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

  • Нет связанных вопросов^_^