1

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 脚本的命令行或其他类型的参数?

谢谢!

4

3 回答 3

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])
于 2013-05-24T04:59:36.310 回答
1

好吧,你已经在做这件事了。

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

def main(kFirstColumns):
    ...

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

然后像这样运行你的脚本

$ python myScript.py 7

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

于 2013-05-24T03:55:34.330 回答
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)

希望有帮助。

于 2013-05-24T09:58:57.900 回答