luigi目标为不存在的表

时间:2014-12-05 18:34:11

标签: python hadoop hive scheduler

我尝试使用luigi.hive.HiveTableTarget

为luigi任务设置一个简单的表存在测试

我在hive中创建一个简单的表,以确保它在那里:

create table test_table (a int);

接下来我用luigi设置目标:

from luigi.hive import HiveTableTarget
target = HiveTableTarget(table='test_table')

>>> target.exists()
True

很好,接下来我尝试使用我知道 的表来确保它返回false。

target = HiveTableTarget(table='test_table_not_here')

>>> target.exists()

它引发了一个例外:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python2.6/site-packages/luigi/hive.py", line 344, in exists
    return self.client.table_exists(self.table, self.database)
  File "/usr/lib/python2.6/site-packages/luigi/hive.py", line 117, in table_exists
    stdout = run_hive_cmd('use {0}; describe {1}'.format(database, table))
  File "/usr/lib/python2.6/site-packages/luigi/hive.py", line 62, in run_hive_cmd
    return run_hive(['-e', hivecmd], check_return_code)
  File "/usr/lib/python2.6/site-packages/luigi/hive.py", line 56, in run_hive
    stdout, stderr)
luigi.hive.HiveCommandError: ('Hive command: hive -e use default; describe test_table_not_here
failed with error code: 17', '', '\nLogging initialized using configuration in
jar:file:/opt/cloudera/parcels/CDH-5.2.0-1.cdh5.2.0.p0.36/jars/hive-common-0.13.1-
cdh5.2.0.jar!/hive-log4j.properties\nOK\nTime taken: 0.822 seconds\nFAILED: 
SemanticException [Error 10001]: Table not found test_table_not_here\n')
为清晰起见,

编辑了格式

我不明白异常的最后一行。当然没有找到表,这是存在检查的全部要点。这是预期的行为还是我需要解决一些配置问题?

1 个答案:

答案 0 :(得分:2)

好吧所以看起来这可能是最新标记版本(1.0.19)中的一个错误,但它已在主分支上修复。负责的代码是:

stdout = run_hive_cmd('use {0}; describe {1}'.format(database, table))
return not "does not exist" in stdout

在主人中更改为:

stdout = run_hive_cmd('use {0}; show tables like "{1}";'.format(database, table))
return stdout and table in stdout

后者工作正常,而前者抛出HiveCommandError

如果您想要一个无需更新到主分支的解决方案,您可以轻松创建自己的目标类:

from luigi.hive import HiveTableTarget, run_hive_cmd

class MyHiveTarget(HiveTableTarget):
    def exists(self):
        stdout = run_hive_cmd('use {0}; show tables like "{1}";'.format(self.database, self.table))
        return self.table in stdout

这将产生所需的输出。