2015-07-07 4 views
1

Вопрос, который у меня есть, есть функция сборки в свинге, чтобы перетасовать кортеж/сумку?Имеет ли Pig функцию перетасовки?

raw_record = LOAD '$inputPath' -- USING com.test.parser.TestParser; 
record_project = FOREACH raw_record GENERATE 
     field1, 
     field2, 
     field3, 
     field4; 

sl_record = FILTER record_project BY (field1=='1' OR field1=='2'); 
split sl_record into rec1 if field1=='1',rec2 if field1=='2'; 
rec2Sample = SAMPLE rec2 $samplingRate; 
finalRec1 = FOREACH rec1 GENERATE 
     -1, 
     1, 
     field1, 
     field2, 
     field3, 
     field4; 

finalRec2 = FOREACH rec2 GENERATE 
     1, 
     1, 
     field1, 
     field2, 
     field3, 
     field4; 

unionRec = UNION finalRec1, finalRec2; 
STORE unionRec INTO '$outputPath' USING PigStorage(','); 


В приведенном выше примере проблема с объединением, я видеть все finalRec1 следуют все finalRec2. Мне нужно, чтобы это было перетасовано или смешано.

Подход, который я взял, чтобы решить это:

raw_record = LOAD '$inputPath' -- USING com.test.parser.TestParser; 
record_project = FOREACH raw_record GENERATE 
     field1, 
     field2, 
     field3, 
     field4; 

sl_record = FILTER record_project BY (field1=='1' OR field1=='2'); 
split sl_record into rec1 if field1=='1',rec2 if field1=='2'; 
rec2Sample = SAMPLE rec2 $samplingRate; 
finalRec1 = FOREACH rec1 GENERATE 
     -1, 
     1, 
     field1, 
     field2, 
     field3, 
     field4, 
     (chararray)RANDOM() AS id; 

finalRec2 = FOREACH rec2 GENERATE 
     1, 
     1, 
     field1, 
     field2, 
     field3, 
     field4, 
     (chararray)RANDOM() AS id; 

unionRec = UNION finalRec1, finalRec2; 
mixedRec = ORDER unionRec BY id ASC 
STORE mixedRec INTO '$outputPath' USING PigStorage(','); 

Таким образом, я был в состоянии смешать их, но теперь я не могу написать тест блока свинью. Есть ли способ, которым я могу перетасовать unionRec напрямую, а также написать тест на свиное устройство?

Тест:

@Test 
public void myPigUnitTest { 
    String []inputs=new String[] { 
     "inputPath=/src/test/resource/testFile.txt", 
     "samplingRate=1", 
     "outputPath=dummy" 
    }; 
    PigTest pigTest = PigUnitUtil.createPigTest("pathToMyPigFile",inputs); 
    String [] expectedUnion; 
    String [] expectedMixedRec; 
    pigTest.assertOutput("unionRec",expectedUnion); 
    pigTest.assertOutput("mixedRec",expectedMixedRec); 
} 

Здесь проблема заключается в том, что unionRec и mixedRec имеют случайное число, а также существует порядок для смешанного перепутались.

+0

Можете ли вы уточнить часть _unit test_? Почему ты не можешь написать его? –

+0

@MarekGrzenkowicz проблема случайная часть, которая не может быть определена. Я также обновлю вопрос с помощью моего модульного теста. – StackFlowed

ответ

2

мне удалось придумать работу вокруг себя:

raw_record = LOAD '$inputPath' -- USING com.test.parser.TestParser; 
record_project = FOREACH raw_record GENERATE 
     field1, 
     field2, 
     field3, 
     field4; 

sl_record = FILTER record_project BY (field1=='1' OR field1=='2'); 
split sl_record into rec1 if field1=='1',rec2 if field1=='2'; 
rec2Sample = SAMPLE rec2 $samplingRate; 
finalRec1 = FOREACH rec1 GENERATE 
     -1 as label1, 
     1 as label2, 
     field1 as label3, 
     field2 as label4, 
     field3 as label5, 
     field4 as label6; 

finalRec2 = FOREACH rec2 GENERATE 
     -1 as label1, 
     1 as label2, 
     field1 as label3, 
     field2 as label4, 
     field3 as label5, 
     field4 as label6; 

unionRec = UNION finalRec1, finalRec2; 
unionRecWithId = FOREACH unionRec GENERATE label1, label2, label3, label4, label5, label6,(chararray)RANDOM() AS id; 
mixedRec = ORDER unionRecWithId by id ASC; 
STORE mixedRec INTO '$outputPath' USING PigStorage(','); 

Теперь я проверить unionRec, если у него есть все данные, как и ожидалось.

+0

Правильно ли работает проверка устройства? –

+1

Да, теперь я проверяю unionRec. – StackFlowed

1

После кортежи были перемешиваются, проект колонны уронить id и вызвать assertOutputAnyOrder:

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

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