如何在配置单元中将参数传递给python流脚本?

wlzqhblo  于 2021-06-04  发布在  Hadoop
关注(0)|答案(3)|浏览(384)

配置单元用户可以通过脚本流式传输表以转换数据:

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

xmakbtuz

xmakbtuz1#

有点老套,但您可以通过将参数作为附加列包含在查询中来传递它。

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)

希望有帮助。

zbsbpyhn

zbsbpyhn2#

解决办法真的很琐碎。使用

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])
w80xi6nr

w80xi6nr3#

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

def main(kFirstColumns):
    ...

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

然后像这样运行脚本

$ python myScript.py 7

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

相关问题