2015-05-27 2 views
1

Мне нужно форматировать данные в плоском файле до его загрузки в таблицу Hive.Табличная схема внутри PIG UDF

CF32|4711|00010101Z| +34.883| 98562AS1D |N8594ãä| 00 | 2 

Файл трубы разделены, и мне нужно применять различные чистящие и функции форматирования на разных колонках в плоском файле. У меня есть несколько функций для Clean_Text, Format_Date, Format_TimeStamp, Format_Integer и т. Д.

Моя идея - передать схему как конструктор в мой UDF и вызвать различные функции на плоском файле в свинье.

A = LOAD 'call_detail_records' USING org.apache.hcatalog.pig.HCatLoader(); 
DESCRIBE A; 

REGISTER ZPigUdfs.jar; 
DEFINE DFormat com.zna.pig.udf.DataColumnFormatter(A); 

B = FOREACH A GENERATE DFormat($0); 
DUMP B; 

Но как я могу пройти схему? DUMP A фактически выгружает всю таблицу, но мне нужны только метаданные. Мой текущий UDF псевдо-код выглядит

общественного класса DataColumnFormatter расширяет EvalFunc {

private Tuple schema; 

public DataColumnFormatter(Tuple schema) { 
    this.schema = schema; 
} 

@Override 
public String exec(Tuple inputTuple) throws IOException { 

    if (inputTuple != null && inputTuple.size() > 0) { 
     String inpString = inputTuple.get(0).toString(); 
     System.out.println(inpString); 
     System.out.println(schema); 

     /** 
     * Logic for splitting the string as pipe and apply functions based 
     * on positions of schema if(schema[1] -> date){ 
     * 
     * formatDate(input) }else if(schema[1] -> INT){ 
     * 
     * formatInt(input); } 
     * 
     */ 

    } 

    return null; 
} 

}

Как я могу получить схему в PIG UDF или есть альтернативный способ для достижения этой цели.

Заранее спасибо.

+0

(1) Откуда должна произойти эта схема? (2) Что удерживает вас от определения схемы как константы? (3) Возможно ли, что разные строки внутри одной таблицы будут иметь другую схему? –

+0

Схема должна быть из HCкаталога. У меня есть несколько файлов, и я не хочу определять схему каждый раз, когда запускаю скрипты. Нет всех записей в таблице, имеющих одну и ту же схему. – Abhi

ответ

1

Изнутри вашего EvalFunc вы можете позвонить this.getInputSchema() (хотя бы с того момента, как Pig v0.12, возможно, раньше). Вам не нужно ничего делать, чтобы пройти в схеме, и с тех пор, как вы загрузились из HCatalog, A уже будет оформлен.

В качестве альтернативы вы можете рассмотреть возможность разделить отдельные функции UDF для каждого типа данных. Что-то вроде B = FOREACH A GENERATE dateFormat($0), cleanText($1), dateFormat($2);

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