ОТДЕЛКА СВИНЬИ И ВЕРХНЯЯ ЧАСТЬ

Я новичок в программировании Hadoop, ищу помощи в pig. У меня есть данные из формата simple.txt как разделитель ,. У меня есть два варианта использования. Я хочу сделать ltrim(rtrim()) для всех столбцов и перейти к UPPER для выбранных полей.

Вот мой сценарий:

party = Load '/party_test_pig.txt' USING PigStorage(',') AS(....);
Trim_party = FOREACH Upper_party GENERATE TRIM(*);
Upper_party = FOREACH party GENERATE UPPER(col1), UPPER(col2), UPPER(col3);

Upper_party:После того, как я сделал его заглавным, я хочу просмотреть все столбцы, а не только столбцы, которые переводятся в верхний регистр.

Trim_party:провел небольшое исследование и выяснил, что для обрезки всех столбцов мне придется написать UDF. Я могу сделать Trim_party = FOREACH Upper_party GENERATE TRIM(col1)...TRIM(coln);, но мне кажется, что это неэффективно и отнимает много времени.

Есть ли другой способ заставить этот скрипт работать без написания UDF для Trim?

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


person LazyBones    schedule 11.11.2015    source источник


Ответы (1)


было бы проще, если бы вы предоставили образец своих данных. Насколько я понимаю, я бы сделал так:

-- Load each line as one string with TextLoader
A = LOAD '/user/guest/Pig/20151112.PigTest.txt' USING TextLoader() AS (line:CHARARRAY);
-- Apply TRIM and UPPER transformation, it will keep spaces that are inside your strings
B = FOREACH A GENERATE UPPER(line) AS lineUP;
-- Split lines with your delimiter
C = FOREACH B GENERATE FLATTEN(STRSPLIT(lineUP, ',')) AS (col1:CHARARRAY, ... ,coln:CHARARRAY);
-- Select the columns you need
D = FOREACH C GENERATE TRIM(col1) AS col1T, ..., TRIM(coln) AS colnT;
person AntonyBrd    schedule 12.11.2015
comment
привет @AntonyBrd спасибо за ответ. Верх работал исправно. Но Трим не работал. - person LazyBones; 12.11.2015
comment
Я даже запустил B = FOREACH A GENERATE TRIM(line) AS lineTRIM;, чтобы проверить, работает ли он, но и здесь не получилось. - person LazyBones; 12.11.2015
comment
ЗАПИСЬ 1: 101,2015-11-11,201, hola ,Shah,Rukh,Khan, Shahrukh Khan ,SRK,Mr,Male,Married,Hindi,2065,1965-11-02,2065-11-02,1992-11-02,2065-11-02,100 ЗАПИСЬ 2: 102,2015-11-12,202, hi ,Kajol,Tanuja,Mukerjee, Kajol Devgan ,KD,Mrs,Female,Married,Hindi,2066,196-11-03,2065-11-03,1992-11-03,2065-11-03,101 - person LazyBones; 12.11.2015
comment
он потерпел неудачу с ошибкой или не смог сделать то, что вы ожидали? Если да, то чего вы ожидали? - person AntonyBrd; 13.11.2015
comment
это не оправдало моих ожиданий... так что мой вклад был ##Шахрукх Кхан## . Рассматривайте ## как пространство, которое я хотел бы ОБРЕЗАТЬ в моем окончательном выводе. Ожидаемый результат — Шахрукх Кхан (левый и правый пробелы должны быть удалены). - person LazyBones; 13.11.2015
comment
Ввод: 101,2015-11-11,201, hola ,Shah,Rukh,Khan, Shahrukh Khan ,SRK,Mr,Male,Married,Hindi,2065,1965-11-02,2065-11-02,1992-11-02,2065-11-02,100. Как видите, в 8-м столбце после запятой есть лишний пробел. Поэтому я хочу избавиться от этого пространства. Ожидается: 101,2015-11-11,201, hola ,Shah,Rukh,Khan,Shahrukh Khan,SRK,Mr,Male,Married,Hindi,2065,1965-11-02,2065-11-02,1992-11-02,2065-11-02,100 - person LazyBones; 13.11.2015
comment
Хорошо, причина на самом деле довольно проста, мой плохой! Если мы применим TRIM ко всей строке, это не повлияет на каждое поле. Я изменил свой код. Извиняюсь. - person AntonyBrd; 13.11.2015
comment
поэтому у меня есть TRIM каждый столбец? D = FOREACH C GENERATE TRIM(col1) AS col1T, TRIM(col2) AS col2T, TRIM(col3) AS col3T, TRIM(col4) AS col4T; Что делать, если у меня 200 столбцов? - person LazyBones; 13.11.2015
comment
Да, вы должны ОБРЕЗАТЬ каждое поле. Если у вас 200 столбцов, я предлагаю удалить все пробелы: A2 = FOREACH A GENERATE REPLACE(line,' '',''); Если вы не хотите удалять все пробелы, создайте UDF, который принимает кортеж из 200 элементов и возвращает другой кортеж из 200 элементов. - person AntonyBrd; 13.11.2015
comment
Я думаю, что UDF будет лучшим вариантом. Потому что при замене происходит то, что если между именем Shahrukh Khan есть пробел, оно становится ShahrukhKhan. Спасибо @AntonyBrd - person LazyBones; 13.11.2015
comment
Привет @LazyBones, сначала вам нужно зарегистрировать свою банку в своем сценарии свиньи, затем вы должны определить свою функцию: REGISTER /path/to/jar/myJar.jar; и DEFINE STRTRIM packagename.classname(); Но я не думаю, что написанная вами UDF даст ожидаемый результат. Вы должны обрезать каждое значение вашего кортежа, а не только первое (я предлагаю использовать лямбда-выражение или что-то подобное вместо цикла for) - person AntonyBrd; 17.11.2015