使用 Python 的 Hive UDF - 在 shell 上打印异常

Posted

技术标签:

【中文标题】使用 Python 的 Hive UDF - 在 shell 上打印异常【英文标题】:Hive UDF with Python - Print exception on shell 【发布时间】:2016-04-20 07:10:46 【问题描述】:

在下面的代码中,每当捕获到异常时,我想退出程序并在 shell 上打印异常

#stream.py
import hashlib
import sys
import os
import importlib


for line in sys.stdin.readlines():
        try:
            inpFile = "temp.py"
            execfile(inpFile)
            line1 = line.strip('\n').split('\t')
            print "\t".join(line1)
        except:
            #exception expected "temp.py:File Not Found", how do I exit the code & print the exception on console ? 
            sys.exit(1)

这里是调用 UDF 的转换查询:

创建表 newtable as Select TRANSFORM(id,name) USING 'python stream.py' as (id,name) from mytable;

想法赞赏。

【问题讨论】:

【参考方案1】:

如果您想捕获特定类型的异常(例如 IOError),您可以使用

  except IOError as e:

并使用e.strerror访问错误字符串

如果您想捕获所有异常,您可以使用sys.exc_info()[0] 访问最后一条错误消息

例如

try:
   1/0
except:
   print sys.exc_info()[0]

会打印

<type 'exceptions.ZeroDivisionError'>

【讨论】:

是的,但是“打印”会在表格中打印一个链接。检查问题中的编辑 正确 - 如果你想在 stderr 上输出错误信息,你可以使用 print("message %s", sys.exc_info()[0], file=sys.stderr) 抛出语法错误,file=sys.stderr 是否将错误写入文件? 不,它会将其写入错误 io 流。有关标准 io 流的说明,请参阅 en.wikipedia.org/wiki/Standard_streams print (..., file=sys.stderr) 是 Python 3 语法(或未来的 print_function)。显然 OP 正在使用 Python 2。【参考方案2】:

如果你期待一个特定的异常,那么你应该捕获它,而不是所有的,这就是你正在做的。但是您的代码中没有任何内容可以生成“找不到文件”!

编辑:问题代码已更改!我们确实希望捕获“一切”。我正在使用Exception,它会捕获“几乎”所有内容,请参阅https://docs.python.org/2/library/exceptions.html

这使用 Python 2 语法:

import sys
for line in sys.stdin.readlines():
    try:    
        inpFile = "temp.py"
        execfile(inpFile)
        line1 = line.strip('\n').split('\t')
        print "\t".join(line1)

    except Exception as err:
        print >> sys.stderr, err   #  print to stderr (python 2 syntax)
        sys.exit(1)

【讨论】:

是的,但是“打印”会在表格中打印一个链接。检查问题中的编辑 运气不好,上面的脚本抛出运行时异常“org.apache.hadoop.hive.ql.metadata.HiveException: [Error 20003]: An error occurred when close the Operator running your custom脚本”。 听起来你不允许在 hadoop 中使用sys.exit(1)。也许您因错误退出而引发了该异常-但我猜。我没有任何hadoop经验。也许您应该写入您的 shell 程序正在使用的控制台或 tty(取决于操作系统)。我认为这就是您所说的“在 shell 上打印”的意思。

以上是关于使用 Python 的 Hive UDF - 在 shell 上打印异常的主要内容,如果未能解决你的问题,请参考以下文章

在 hive 中使用 python udf 时如何查询多个列?

检查python写的hive udf中的错误

Spark(Hive) SQL中UDF的使用(Python)

如何使用 python 在 HIVE 中创建 UDF 进行时间戳转换

使用 Python 的 Hive UDF - 在 shell 上打印异常

python实现hive-udf