2016-08-04 7 views
1

Я пытаюсь прочитать данные из таблицы Hive с помощью Pig. Подробности следуют:Чтение таблицы, не связанной с строкой, в Pig

  • Hive версия 1,1
  • Pig 0,12
  • Hadoop 2.6.0
  • Cloudera Распределение 5.4.4

Hive схема таблицы:

map <string, string> 
yyyy int 
mm int 
dd int 

Partitions are yyyy(int), mm(int), dd(int) 

Pig код:

input_data = LOAD ‘dbname.tablename' 
      USING org.apache.hive.hcatalog.pig.HCatLoader() 
      ; 

input_data_f = FILTER input_data BY yyyy == 2016 AND 
             mm == 7 AND 
             dd == 19 
             ; 

rmf input_data_dump; 
STORE input_data_f INTO ‘input_data_dump'; 

Команда используется для запуска: pig -useHCatalog -f ./read_input.pig

Я получаю следующее сообщение об ошибке.

Error: 
Pig Stack Trace 
--------------- 
ERROR 2017: Internal error creating job configuration. 

org.apache.pig.backend.hadoop.executionengine.mapReduceLayer.JobCreationException: ERROR 2017: Internal error creating job configuration. 
     at org.apache.pig.backend.hadoop.executionengine.mapReduceLayer.JobControlCompiler.getJob(JobControlCompiler.java:873) 
     at org.apache.pig.backend.hadoop.executionengine.mapReduceLayer.JobControlCompiler.compile(JobControlCompiler.java:298) 
     at org.apache.pig.backend.hadoop.executionengine.mapReduceLayer.MapReduceLauncher.launchPig(MapReduceLauncher.java:190) 
     at org.apache.pig.PigServer.launchPlan(PigServer.java:1334) 
     at org.apache.pig.PigServer.executeCompiledLogicalPlan(PigServer.java:1319) 
     at org.apache.pig.PigServer.execute(PigServer.java:1309) 
     at org.apache.pig.PigServer.executeBatch(PigServer.java:387) 
     at org.apache.pig.PigServer.executeBatch(PigServer.java:365) 
     at org.apache.pig.tools.grunt.GruntParser.executeBatch(GruntParser.java:140) 
     at org.apache.pig.tools.grunt.GruntParser.parseStopOnError(GruntParser.java:202) 
     at org.apache.pig.tools.grunt.GruntParser.parseStopOnError(GruntParser.java:173) 
     at org.apache.pig.tools.grunt.Grunt.exec(Grunt.java:84) 
     at org.apache.pig.Main.run(Main.java:478) 
     at org.apache.pig.Main.main(Main.java:156) 
     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
     at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
     at java.lang.reflect.Method.invoke(Method.java:606) 
     at org.apache.hadoop.util.RunJar.run(RunJar.java:221) 
     at org.apache.hadoop.util.RunJar.main(RunJar.java:136) 
Caused by: java.io.IOException: MetaException(message:Filtering is supported only on partition keys of type string) 
     at org.apache.hive.hcatalog.mapreduce.HCatInputFormat.setInput(HCatInputFormat.java:97) 
     at org.apache.hive.hcatalog.mapreduce.HCatInputFormat.setInput(HCatInputFormat.java:61) 
     at org.apache.hive.hcatalog.pig.HCatLoader.setLocation(HCatLoader.java:125) 
     at org.apache.pig.backend.hadoop.executionengine.mapReduceLayer.JobControlCompiler.getJob(JobControlCompiler.java:498) 
     ... 19 more 
Caused by: MetaException(message:Filtering is supported only on partition keys of type string) 
     at org.apache.hadoop.hive.metastore.api.ThriftHiveMetastore$get_partitions_by_filter_result$get_partitions_by_filter_resultStandardScheme.read(ThriftHiveMetastore.java) 
     at org.apache.hadoop.hive.metastore.api.ThriftHiveMetastore$get_partitions_by_filter_result$get_partitions_by_filter_resultStandardScheme.read(ThriftHiveMetastore.java) 
     at org.apache.hadoop.hive.metastore.api.ThriftHiveMetastore$get_partitions_by_filter_result.read(ThriftHiveMetastore.java) 
     at org.apache.thrift.TServiceClient.receiveBase(TServiceClient.java:78) 
     at org.apache.hadoop.hive.metastore.api.ThriftHiveMetastore$Client.recv_get_partitions_by_filter(ThriftHiveMetastore.java:2132) 
     at org.apache.hadoop.hive.metastore.api.ThriftHiveMetastore$Client.get_partitions_by_filter(ThriftHiveMetastore.java:2116) 
     at org.apache.hadoop.hive.metastore.HiveMetaStoreClient.listPartitionsByFilter(HiveMetaStoreClient.java:1047) 
     at org.apache.hive.hcatalog.mapreduce.InitializeInput.getInputJobInfo(InitializeInput.java:113) 
     at org.apache.hive.hcatalog.mapreduce.InitializeInput.setInput(InitializeInput.java:86) 
     at org.apache.hive.hcatalog.mapreduce.HCatInputFormat.setInput(HCatInputFormat.java:95) 
     ... 22 more 

Глядя на сети у меня https://issues.apache.org/jira/browse/HIVE-7164

ли установка hive.metastore.integral.jdo.pushdown истина в улье-site.xml единственное решение? Это корпоративная настройка, поэтому я не уверен, могу ли я вносить изменения в hive-site.xml, и если я получу администратор для внесения изменений, будут ли какие-либо побочные эффекты?

Пробовал следующее:

Покушение 1

set hive.metastore.integral.jdo.pushdown true; 

input_data = LOAD ‘dbname.tablename' 
      USING org.apache.hive.hcatalog.pig.HCatLoader() 
      ; 

input_data_f = FILTER input_data BY yyyy == 2016 AND 
             mm == 7 AND 
             dd == 19 
             ; 

STORE input_data_f INTO ‘input_data_dump'; 

Я вижу это в журнале:

org.apache.pig.newplan.logical.optimizer.LogicalPlanOptimizer - {RULES_ENABLED=[AddForEach, ColumnMapKeyPrune, DuplicateForEachColumnRewrite, GroupByConstParallelSetter, ImplicitSplitInserter, LimitOptimizer, LoadTypeCastInserter, MergeFilter, MergeForEach, NewPartitionFilterOptimizer, PushDownForEachFlatten, PushUpFilter, SplitFilter, StreamTypeCastInserter], RULES_DISABLED=[FilterLogicExpressionSimplifier, PartitionFilterOptimizer]} 

Попытка 2

set hive.metastore.integral.jdo.pushdown true; 
set pig.exec.useOldPartitionFilterOptimizer true; 

input_data = LOAD ‘dbname.tablename' 
      USING org.apache.hive.hcatalog.pig.HCatLoader() 
      ; 

input_data_f = FILTER input_data BY yyyy == 2016; 
input_data_f1 = FILTER input_data_f BY mm == 7; 
input_data_f2 = FILTER input_data_f1 BY dd == 19; 

STORE input_data_f2 INTO ‘input_data_dump'; 

Я вижу это в журнале:

org.apache.pig.newplan.logical.optimizer.LogicalPlanOptimizer - {RULES_ENABLED=[AddForEach, ColumnMapKeyPrune, DuplicateForEachColumnRewrite, GroupByConstParallelSetter, ImplicitSplitInserter, LimitOptimizer, LoadTypeCastInserter, MergeFilter, MergeForEach, PartitionFilterOptimizer, PushDownForEachFlatten, PushUpFilter, SplitFilter, StreamTypeCastInserter], RULES_DISABLED=[FilterLogicExpressionSimplifier, NewPartitionFilterOptimizer]} 

Покушение 3

set pig.exec.useOldPartitionFilterOptimizer true; 

input_data = LOAD ‘dbname.tablename' 
      USING org.apache.hive.hcatalog.pig.HCatLoader() 
      ; 

input_data_f = FILTER input_data BY yyyy == 2016; 
input_data_f1 = FILTER input_data_f BY mm == 7; 
input_data_f2 = FILTER input_data_f1 BY dd == 19; 

STORE input_data_f2 INTO ‘input_data_dump'; 

Я вижу это в журнале:

org.apache.pig.newplan.logical.optimizer.LogicalPlanOptimizer - {RULES_ENABLED=[AddForEach, ColumnMapKeyPrune, DuplicateForEachColumnRewrite, GroupByConstParallelSetter, ImplicitSplitInserter, LimitOptimizer, LoadTypeCastInserter, MergeFilter, MergeForEach, PartitionFilterOptimizer, PushDownForEachFlatten, PushUpFilter, SplitFilter, StreamTypeCastInserter], RULES_DISABLED=[FilterLogicExpressionSimplifier, NewPartitionFilterOptimizer]} 

С учетом указанных выше попыток я все еще получаю такая же ошибка.

Оцените справку.

ответ

1

Update:
Partition фильтр не толкнул в погрузчик в некоторых случаях:
В Свиньи 0.12.0, Свинья только толкает первый фильтр для погрузчика. Вы получите тот же результат, но из-за этого снижается производительность. - Чтобы обойти это, вы должны использовать один оператор фильтра для всех разделов.Или вы можете указать: pig.exec.useOldPartitionFilterOptimizer=truesee deails here - known issue of 0.12

Для свиноводства сценария конкретных свойств, которые вы можете использовать один из этих опций:

- The pig.properties файла (добавить в каталоге, содержащий файл pig.properties пути к классам)
- опция -D командной строки и свойство Pig (поросенок -Dpig.tmpfilecompression=true)
- опция -P командной строки и свойства файла (pig -P mypig.properties)
- The set команда (set pig.exec.nocombiner true) непосредственно в свиноводстве sctipt

more details on properties here. . .

Тест: преобразованный к типу chararray

$ hadoop version 
Hadoop 2.6.0-cdh5.7.0 

$ pig -version 
Apache Pig version 0.12.0-cdh5.7.0 (rexported) 

$ cat pig_test1 
-- set hive.metastore.integral.jdo.pushdown true; 
input_data = LOAD 'cards.props' 
      USING org.apache.hive.hcatalog.pig.HCatLoader() 
      ; 

input_data_f = FILTER input_data BY (chararray)yyyy == '2106' AND 
            (chararray)mm == '8' AND 
             (chararray)dd == '4' 
             ; 
dump input_data_f; 

2016-08-04 17:15:54,541 [main] INFO org.apache.pig.tools.pigstats.ScriptState - Pig script settings are added to the job 
([1#test1],2106,8,4) 
([2#test2],2106,8,4) 
([3#test3],2106,8,4) 

hive> select * from props; 
OK 
{"1":"test1"} 2106 8 4 
{"2":"test2"} 2106 8 4 
{"3":"test3"} 2106 8 4 
+0

Спасибо за быстрый ответ , Я попробовал установить свойство в скрипте, но я все равно получаю то же самое. «Фильтрация поддерживается только по ключам раздела строки типа». Я также попытался установить его в файле .pigbootup, но с той же ошибкой снова. – Arnkrishn

+0

В Pig 0.12.0, Pig только толкает первый фильтр на загрузчик. Вы получите тот же результат, но из-за этого снижается производительность. - Чтобы обойти это, вы должны использовать один оператор фильтра для всего раздела. Или вы можете указать: 'pig.exec.useOldPartitionFilterOptimizer = true' [см. Ссылку на файлы - известная проблема 0.12] (https://cwiki.apache.org/confluence/display/PIG/Pig+0.12.0+Known+ Проблемы) - обновил этот комментарий и в ответ. –

+0

Спасибо! Я попытался разделить оператор фильтра на 3 фильтра, а флаг pig.exec.useOldPartitionFilterOptimizer установлен в true в скрипте, но по-прежнему остается той же ошибкой. У меня есть "set hive.metastore.integral.jdo.pushdown true;" "set pig.exec.useOldPartitionFilterOptimizer true;" в скрипте. – Arnkrishn