使用Hive的TRANSFORM命令在Hadoop表中编写python脚本的输出

时间:2016-04-13 08:29:23

标签: python hadoop hive

我需要在Hive查询中使用python脚本,以便从Hadoop表(mytable1)转换数据并将转换的输出写入另一个表(mytable2),因为我需要的数据是复杂的JSON 。转换应该从mytable1获取1行并在mytable2中写入360行。

为了做到这一点,我被建议使用Hive的TRANSFORM命令,它允许在查询中调用python脚本(脚本如下)。

我的问题是,当整个事情运行时,我的输出表中没有写入任何内容。

我理解这个工作流的工作方式是:第一个子查询的输出由来自stdin的python脚本读取。然后编译的转换输出是stdout(以制表符分隔格式),然后由Hive读回。所以我已经独立测试了一些元素:

  • 阅读mytable1的子查询效果很好。
  • 我还测试了python脚本,为它提供了子查询的输出,并以预期的制表符分隔格式提供了我想要的结果。
  • 我试图在不将输出写入表格的情况下执行查询,此处我没有得到任何输出,因此问题可能与创建表格无关。

所以我的猜测是Hive不会读取python脚本的输出。但我不明白为什么,因为我已经使用了Hive和Python语法,这种语法已被证明可以为我的同事提供类似的案例。

我的Hive查询如下所示:

ADD FILE parsing_json.py;

DROP TABLE IF EXISTS mytable2;
CREATE TABLE mytable2
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '\011' 
AS

SELECT TRANSFORM (output_col1,
                  output_col2,
                  output_col3)
                  USING 'parsing_json.py'
AS (input_col1,
    input_col2)
FROM (SELECT input_col1, input_col2 FROM mytable1);

使用类似的python脚本:

import sys
import pandas


def main():

    for line in sys.stdin:
        var1, var2, var3 = line.split('\t')

        # my output Dataframe has 2 columns
        output = sometransformation(var1, var2, var3)
        print output.to_csv(sep='\t', index=False, header=False),


if __name__ == "__main__":
    main()

2 个答案:

答案 0 :(得分:1)

不确定您使用的是哪个版本的python。 但您可以使用OS库从CSV文件写入Hive。 以下是代码

import os;

output.to_csv('/home/output.csv',sep='\t', index=False, encoding='utf-8')

load_statement = "hive -e \"LOAD DATA LOCAL INPATH '/home/output.csv' OVERWRITE INTO TABLE mytable2\""

os.system(load_statement);

答案 1 :(得分:-1)

您在python声明中的.py文件前面遗漏了SELECT

尝试:

USING 'python parsing_json.py'

代替。

在.py中添加shebang也可以。