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脚本的命令行或其他类型的参数?
谢谢!
答案 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)
希望有所帮助。