Pig Latin: загрузка нескольких файлов из диапазона дат (часть структуры каталога)

У меня есть следующий сценарий-

Используемая версия Pig 0.70

Пример структуры каталогов HDFS:

/user/training/test/20100810/<data files>
/user/training/test/20100811/<data files>
/user/training/test/20100812/<data files>
/user/training/test/20100813/<data files>
/user/training/test/20100814/<data files>

Как видно из приведенных выше путей, одно из имен каталогов является отметкой даты.

Проблема: Я хочу загрузить файлы из диапазона дат, скажем, с 20100810 по 20100813.

Я могу передать «от» и «до» диапазона дат в качестве параметров для Pig скрипт, но как мне использовать эти параметры в операторе LOAD. Я могу сделать следующее

temp = LOAD '/user/training/test/{20100810,20100811,20100812}' USING SomeLoader() AS (...);

Следующее работает с hadoop:

hadoop fs -ls /user/training/test/{20100810..20100813}

Но оно терпит неудачу, когда я пытаюсь сделать то же самое с LOAD внутри скрипта pig. Как использовать параметры, переданные в сценарий Pig, для загрузки данных из диапазона дат?

Журнал ошибок следует:

Backend error message during job submission
-------------------------------------------
org.apache.pig.backend.executionengine.ExecException: ERROR 2118: Unable to create input splits for: hdfs://<ServerName>.com/user/training/test/{20100810..20100813}
        at org.apache.pig.backend.hadoop.executionengine.mapReduceLayer.PigInputFormat.getSplits(PigInputFormat.java:269)
        at org.apache.hadoop.mapred.JobClient.writeNewSplits(JobClient.java:858)
        at org.apache.hadoop.mapred.JobClient.writeSplits(JobClient.java:875)
        at org.apache.hadoop.mapred.JobClient.access$500(JobClient.java:170)
        at org.apache.hadoop.mapred.JobClient$2.run(JobClient.java:793)
        at org.apache.hadoop.mapred.JobClient$2.run(JobClient.java:752)
        at java.security.AccessController.doPrivileged(Native Method)
        at javax.security.auth.Subject.doAs(Subject.java:396)
        at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1062)
        at org.apache.hadoop.mapred.JobClient.submitJobInternal(JobClient.java:752)
        at org.apache.hadoop.mapred.JobClient.submitJob(JobClient.java:726)
        at org.apache.hadoop.mapred.jobcontrol.Job.submit(Job.java:378)
        at org.apache.hadoop.mapred.jobcontrol.JobControl.startReadyJobs(JobControl.java:247)
        at org.apache.hadoop.mapred.jobcontrol.JobControl.run(JobControl.java:279)
        at java.lang.Thread.run(Thread.java:619)
Caused by: org.apache.hadoop.mapreduce.lib.input.InvalidInputException: Input Pattern hdfs://<ServerName>.com/user/training/test/{20100810..20100813} matches 0 files
        at org.apache.hadoop.mapreduce.lib.input.FileInputFormat.listStatus(FileInputFormat.java:231)
        at org.apache.pig.backend.hadoop.executionengine.mapReduceLayer.PigTextInputFormat.listStatus(PigTextInputFormat.java:36)
        at org.apache.hadoop.mapreduce.lib.input.FileInputFormat.getSplits(FileInputFormat.java:248)
        at org.apache.pig.backend.hadoop.executionengine.mapReduceLayer.PigInputFormat.getSplits(PigInputFormat.java:258)
        ... 14 more



Pig Stack Trace
---------------
ERROR 2997: Unable to recreate exception from backend error: org.apache.pig.backend.executionengine.ExecException: ERROR 2118: Unable to create input splits for: hdfs://<ServerName>.com/user/training/test/{20100810..20100813}

org.apache.pig.impl.logicalLayer.FrontendException: ERROR 1066: Unable to open iterator for alias test
        at org.apache.pig.PigServer.openIterator(PigServer.java:521)
        at org.apache.pig.tools.grunt.GruntParser.processDump(GruntParser.java:544)
        at org.apache.pig.tools.pigscript.parser.PigScriptParser.parse(PigScriptParser.java:241)
        at org.apache.pig.tools.grunt.GruntParser.parseStopOnError(GruntParser.java:162)
        at org.apache.pig.tools.grunt.GruntParser.parseStopOnError(GruntParser.java:138)
        at org.apache.pig.tools.grunt.Grunt.run(Grunt.java:75)
        at org.apache.pig.Main.main(Main.java:357)
Caused by: org.apache.pig.backend.executionengine.ExecException: ERROR 2997: Unable to recreate exception from backend error: org.apache.pig.backend.executionengine.ExecException: ERROR 2118: Unable to create input splits for: hdfs://<ServerName>.com/user/training/test/{20100810..20100813}
        at org.apache.pig.backend.hadoop.executionengine.mapReduceLayer.Launcher.getStats(Launcher.java:169)

Нужно ли использовать более высокий язык, такой как Python, для захвата всех отметок даты в диапазоне и передачи их в LOAD в виде списка, разделенного запятыми?

cheers

29
задан Arnkrishn 26 August 2010 в 19:10
поделиться

2 ответа

Нужно ли мне использовать более высокий язык, например Python, для захвата всех отметок даты в диапазоне и передачи их в LOAD в виде списка, разделенного запятыми?

Скорее всего, вы этого не сделаете - это можно сделать с помощью настраиваемой UDF-функции Load или попробовать переосмыслить структуру каталогов (это будет хорошо работать, если ваши диапазоны в основном статичны).

дополнительно: Pig принимает параметры, возможно, это поможет вам (возможно, вы могли бы сделать функцию, которая будет загружать данные за один день и объединять их в результирующий набор, но я не знаю, возможно ли это)

редактировать: вероятно Написание простого скрипта python или bash, который генерирует список дат (папок), является самым простым решением, вам просто нужно передать его Pig, и это должно работать нормально

1
ответ дан 28 November 2019 в 00:54
поделиться

Pig поддерживает статус глобуса hdfs ,

, поэтому я думаю, что pig может обрабатывать шаблон / user / training / test / {20100810,20100811,20100812} ,

не могли бы вы вставить журналы ошибок?

0
ответ дан 28 November 2019 в 00:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: