2015-03-25 2 views
0

У меня есть два набора данных; один содержит имя пользователя, назначенный идентификатор, и период времени, когда идентификатор является действительным,Выполнение комплекса, связанного с датами

data1: {username: chararray, id: chararray, start_time: datetime, stop_time: datetime} 

, а другой содержит датируемые события, генерируемые пользователем, идентифицированного ID.

data2: {user_id: chararray, event_data: chararray, event_time: datetime) 

Я пытаюсь соединить два набора, так что я могу совпадать с именем пользователя на событие в течение периода времени, идентификатор является действительным. По сути, я хочу, чтобы применить следующие критерии для объединения в SQL жаргоне:

WHERE (data1.id = data2.user_id) AND (data2.event_time > data1.start_time) AND (data2.event_time < data1.stop_time) 

Я попробовал следующий сценарий:

joined = JOIN data1 BY id, data2 BY user_id; 
matched = FILTER joined BY (SecondsBetween(start_time, event_time) < (long) 0) AND (SecondsBetween(event_time, stop_time) < (long) 0); 

Проблема заключается в том, что я получаю ошибку «ОШИБКА 0: Скалярное имеет более одной строки в выходной ошибке ", когда я пытаюсь запустить ее. Я не уверен, что означает ошибка или как ее исправить.

ответ

1

Вопросы и ответы (0) Как вы загружаете данные? Я запустил код с помощью супер простых данных с одной строкой, и это не вызвало у меня никаких проблем. Ниже приведены мои коды и тестовые данные.

Свинья сценарий

tmp_data1 = LOAD 'data1.txt' USING PigStorage('\t') AS (username:chararray, id:chararray, start_time:chararray, stop_time:chararray); 
tmp_data2 = LOAD 'data2.txt' USING PigStorage('\t') AS (user_id:chararray, event_data:chararray, event_time:chararray); 
data1 = FOREACH tmp_data1 GENERATE 
    username, id, ToDate(start_time, 'yyyy-MM-dd HH:mm:ss') AS start_time, ToDate(stop_time, 'yyyy-MM-dd HH:mm:ss') AS stop_time; 
data2 = FOREACH tmp_data2 GENERATE 
    user_id, event_data, ToDate(event_time, 'yyyy-MM-dd HH:mm:ss') AS event_time; 
joined = JOIN data1 BY id, data2 BY user_id; 
matched = FILTER joined BY (SecondsBetween(start_time, event_time) < (long) 0) AND (SecondsBetween(event_time, stop_time) < (long) 0); 
dump matched; 

data1.txt (следует табуляция)

abc abc 2015-01-01 00:00:00 2015-01-02 00:00:00 

data2.txt (следует табуляцию)

abc abc 2015-01-01 01:00:00 
+0

я возможно, нашли мою проблему. Приведенный выше пример является необходимым упрощением фактических данных, с которыми я работаю. В фактическом сценарии я добавил префиксы отношения (то есть «data1 :: start_time», «data2 :: event_time») к определению согласованных отношений и позаботился об ошибке, которая была сгенерирована. – NestorDRod

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