我需要在Hive查询中使用python脚本,以便从Hadoop表(mytable1)转换数据并将转换的输出写入另一个表(mytable2),因为我需要的数据是复杂的JSON 。转换应该从mytable1获取1行并在mytable2中写入360行。
为了做到这一点,我被建议使用Hive的TRANSFORM命令,它允许在查询中调用python脚本(脚本如下)。
我的问题是,当整个事情运行时,我的输出表中没有写入任何内容。
我理解这个工作流的工作方式是:第一个子查询的输出由来自stdin的python脚本读取。然后编译的转换输出是stdout(以制表符分隔格式),然后由Hive读回。所以我已经独立测试了一些元素:
所以我的猜测是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()
答案 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也可以。