Как загрузить определенный диапазон входных файлов в Pig

1

У меня есть набор входных файлов для обработки с помощью Pig со следующей структурой именования:

/user/hdp/input/custom/Fold1/train0.txt
/user/hdp/input/custom/Fold1/train1.txt
/user/hdp/input/custom/Fold1/train2.txt
/user/hdp/input/custom/Fold1/train3.txt
...
/user/hdp/input/custom/Fold1/train9.txt
/user/hdp/input/custom/Fold1/train10.txt
/user/hdp/input/custom/Fold1/train11.txt
/user/hdp/input/custom/Fold1/train12.txt
...

вплоть до учебного файла 99. Я строю сценарий Pig динамически как Java String, который затем отправляю в свой кластер. Я ищу общее решение для загрузки диапазона файлов поезда от 0 до некоторого числа x, где я могу установить этот x в любой java int до 99.

В предыдущей версии моего решения поддерживаемые значения x до 9, я использовал поддержку Pig для globs следующим образом:

pigString += "TRAIN = LOAD 'user/hdp/input/custom/Fold1/train[0-"+x+"].txt' USING PigStorage(' ');";

Этот подход не масштабируется до значений, больших 9, так как с 10 он начинает принимать два символа вместо одного. Одним из возможных решений было бы разделение x на одну цифру и использование этого для построения свиней String.

int tens   = x/10;
int single = x%10;
if(tens>0)
    pigString += "TRAIN = LOAD 'user/hdp/input/custom/Fold1/train[0-"+tens+"][0-+"single"+.txt' USING PigStorage(' ');";
else
    pigString += "TRAIN = LOAD 'user/hdp/input/custom/Fold1/train[0-"+single+"].txt' USING PigStorage(' ');";

Однако эти решения имеют две проблемы.

  1. Когда x> 9 поезда от 0 до 9 не загружаются, потому что glob соответствует номерам 00, 01 и 02 вместо однозначных версий 0, 1 и 2. Я не видел никакой поддержки в шарах Hadoop, однако для сопоставления первого [ CN10] "+ tens +"] часть нуля или одно время (например, с? В регулярных выражениях).
  2. Когда single - любое значение меньше 9, файлы данных также загружаются только до этого значения для всех значений, меньших, чем десятки. Допустим, что x = 24, чем в приведенном выше коде только нагрузка 1 0- 14, но не 15-19. Я ничего не видел в документации Hadoop glob, но чтобы вторая совпадающая цифра зависела от первого совпадающего didit.

Кто-нибудь знает какое-либо общее решение для загрузки моего диапазона файлов данных до любого значения x? Я не знаю, правильно ли я нахожусь на правильном пути, используя glob, поэтому любое другое решение, отличное от glob, также будет очень оценено.

Спасибо заранее!

  • 0
    Если вы формируете pigString в JAVA, почему бы вам не использовать x.toString () для формирования имени файла, как показано ниже: "/ user / hdp / input / custom / Fold1 / train" + x + ".txt"? Окружите это циклом for, работающим от 0 до x.
  • 0
    Потому что тогда у меня будет x LOAD-операторов, каждый из которых загружает один поезд, в то время как мне нужен 1 LOAD-оператор, который загружает x Train-файлы одновременно.
Показать ещё 9 комментариев
Теги:
hadoop
glob
apache-pig

1 ответ

1
Лучший ответ

Я посмотрел на Hadoop Глоба подписи, и кажется, что это должно быть легко сделать, чем мы первоначально думали.

Создайте строку, разделенную запятыми, всех номеров, которые вас интересуют, и назовите ее expectedNumber. например expectedNumbers = "0,1,2,3,4,5", а затем использовать его, как показано ниже:

pigString += "TRAIN = LOAD 'user/hdp/input/custom/Fold1/train" + {expectedNumbers} +".txt' USING PigStorage(' ');";

Надеюсь это поможет.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню