【问题标题】:Python as Hive UDF - Clean Exit on ExceptionPython 作为 Hive UDF - 异常时清除退出
【发布时间】:2016-04-20 05:09:25
【问题描述】:

每当我作为 Hive UDF 的 python 因异常而失败时,我都会尝试彻底退出程序。
这是一个例子:

SELECT TRANSFORM (id, name) 使用 'D:\Python27\python.exe streaming.py' AS(id 字符串, name string, count integer) FROM hivesampletable;

#streaming.py
import sys
from datetime import datetime

try:
   for line in sys.stdin.readlines(): 
       fields = line.strip().split('\t') 
       fields.append(len(name))
       print "\t".join(fields)
except:
   #I want program to break/clean exit with out printing (writing back) to table

赞赏的想法

【问题讨论】:

  • 您在寻找pass 声明
  • 谢谢,能详细说明一下吗?
  • pass 语句让等效于 NOP 或什么都不做。它的一个流行应用是在您想要忽略某种异常的 except 块中。在捕获异常时不明确声明异常不是最佳做法,但pass 会让您在不中断的情况下静默恢复控制流。
  • 但是我想要一个带有退出代码的干净退出程序,可以通过帮助我做到这一点吗?
  • 我不是你遇到的例外来自python。如果是,pass 将帮助您做到这一点。我不是 Hive 专家,但是查询的 TRANSFORM 部分和列部分是否必须具有相同数量的列?

标签: python exception hive udf


【解决方案1】:

pass 语句将让您忽略错误并将控制流返回给您的程序。

except Exception, e:
    pass 
    #To see your exception
    print str(e)
    # Alternately, you could get details of your exception using
    print sys.exc_info()

【讨论】:

  • 它正在继续流的下一行。我希望它停止流式传输并退出程序
【解决方案2】:

如果您本质上想“吞下”异常,那么我建议您在 except 块中显式调用 sys.exit(0),这将退出程序并指示(从 shell 级别)程序是“好的”。

例如你最终会得到一个真正干净的出口,甚至是一个外壳,例如bash,将被视为“成功”。

注意:如果您想退出而不打印任何内容,但要让 shell 知道出现问题,请将非零错误代码传递给 exit

对 OP 评论的回应:

嗯,我没想到会这样,因为你明确地吞下了异常......

下一步可能是打印出异常是什么,如另一个答案中所建议的那样,然后从那里开始,具体取决于该异常是什么。

另一件事可能是我认为您的 Python 脚本与您的 TRANSFORM 语句不匹配,因此这可能是导致问题的原因。

另外,您引用的是 name,而没有初始化(这可能是这里的例外 -- NameError: name 'name' is not defined)。

【讨论】:

  • 它仍然因运行时异常跟踪而中断,但没有干净退出。 “错误:java.lang.RuntimeException:关闭运算符时 Hive 运行时错误”
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-31
  • 1970-01-01
  • 1970-01-01
  • 2011-10-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多