2013-12-05 3 views
0

У меня есть стол с 15 колонками.Как вычислить вычитание двух столбцов в PigLatin?

2 из этих столбцов имеет формат даты, например: 09/08/2003. Один столбец data_1 - дата начала, другая дата окончания данных_2.

Мне нужно посчитать разницу между столбцами и проверить, составляет ли это различие более 30 дней.

Результатом должна быть таблица со столбцом, которая показывает значения, превышающие 30-дневную разницу, и все остальные 15 столбцов. Сценарий может быть что-то simmilar к этому:

table = LOAD '$INPUT' AS (data_1, data_2, a1, a2, ... a13); 
ggdif = (data_2 - data_1); 
C = FILTER table BY (ggdif > 30) AS differ; 
D = FOREACH C GENERATE a1 .. a13; 
STORE D INTO '$OUTPUT' USING PigStorage('\t'); 

У меня есть некоторые проблемы с этой задачей:

  1. Как подсчитать разницу между 2 столбцами значений?

  2. Как установить дату в правильном формате в свинье?

ответ

0

Просто напишите простой UDF, который принимает 2 столбца в качестве входных данных.

Может быть exec(Tuple input) throws IOException {

В ролях input(0) и input(1) к Date и выполнить вычитание.

Возвращает целочисленный результат.

остальное будет просто filter

Просто, чтобы начать с, вы могли бы просто написать класс

public class DateDifference extends EvalFunc<Integer>{ 

public int exec(Tuple input) throws IOException { 
// Here you could take input.get(0).toString() and form a Date out of it. 
// Same for input.get(1) 
// you could either use Java Date or can use Joda Jars for date difference. 
// return the date difference as integer. 
} 
} 

Приготовьте банку этого.

В свинью оболочки

grunt> REGISTER jarname.jar 

grunt> diffRow = foreach table generate FLATTEN(yourpackagename.DateDifference($0,$1)), and all your other columns... 

Отдых просто, я думаю, вы можете заполнить с остальными.

+0

Спасибо. Извините, но для меня это звучит немного сложно. Можете ли вы объяснить на фиктивном уровне, пожалуйста? – Ale

+0

Нет, спасибо и извините ... http://wiki.apache.org/pig/UDFManual это дает вам очень хорошую ручку в концепции UDF Pig. Пожалуйста, не стесняйтесь бросать заметку, если вам нужна дополнительная помощь. –

+0

Спасибо! Я постараюсь справиться с этим. Я думаю, что это не самый простой способ, может быть, существует менее сложный способ сделать это? – Ale