如何将参数传递给Hive中的Python流脚本?

时间:2013-05-24 03:51:04

标签: python hadoop streaming hive

Hive用户可以通过脚本流表来转换该数据:

ADD FILE replace-nan-with-zeros.py;

SELECT
  TRANSFORM (...)
  USING 'python replace-nan-with-zeros.py'
  AS (...)
FROM some_table;

我有一个简单的Python脚本:

#!/usr/bin/env python
import sys


kFirstColumns= 7

def main(argv):

    for line in sys.stdin:
        line = line.strip();
        inputs = line.split('\t')

        # replace NaNs with zeros
        outputs = [ ]
        columnIndex = 1;
        for value in inputs:
            newValue = value
            if columnIndex > kFirstColumns:
                newValue = value.replace('NaN','0.0')
            outputs.append(newValue)
            columnIndex = columnIndex + 1

        print '\t'.join(outputs)

if __name__ == "__main__":
    main(sys.argv[1:])

如何使 kFirstColumns 成为此Python脚本的命令行或其他类型的参数?

谢谢!

3 个答案:

答案 0 :(得分:4)

解决方案非常简单。使用

ADD FILE replace-nan-with-zeros.py;

SELECT
  TRANSFORM (...)
  USING 'python replace-nan-with-zeros.py 7'
  AS (...)
FROM some_table;

而不仅仅是

  ...
  USING 'python replace-nan-with-zeros.py'
  ...

它适用于我。

Python脚本应更改为:

kFirstColumns= int(sys.argv[1])

答案 1 :(得分:1)

嗯,你已经开始做了。

您正在抓取sys.argv[1:]并将其传递给main,但不使用参数。我建议(最简单的路由方式)是更改脚本如下:

def main(kFirstColumns):
    ...

if __name__ == "__main__":
    main(int(sys.argv[1]))

然后像

一样运行你的脚本
$ python myScript.py 7

然后,当您想要执行更复杂的命令行选项时,可以查看argparse

答案 2 :(得分:0)

有点破解,但您可以通过将其作为查询中的附加列包含来传递参数。

SELECT
  TRANSFORM (...)
  USING 'python replace-nan-with-zeros.py'
  AS (...)
FROM (SELECT 7 AS kFirstColumns, * FROM some_table);

然后,当您解析脚本中的行时,第一列值将是您要查找的参数。只需将其弹出到您的局部变量中即可将其从列值列表中删除。

line = line.strip();
inputs = line.split('\t')
kFirstColumns = inputs.pop(0)

希望有所帮助。