保存多个impala查询输出以在python中使用(不将每个查询保存为.csv)

问题描述 投票:-1回答:1

我正在bash脚本中运行多个impala查询,将它们保存为变量,在终端中打印出结果,此外,尝试将存储在变量中的输出表保存为.txt文件,然后可以在python中对其进行解析:

a=$(impala-shell -q "SELECT 1;")

b=$(impala-shell -q "SELECT 2;")

echo -e "print out result of ${a}, ${b}"

它输出一个表,如:

+---+
| 1 |
+---+
| 1 |
+---+
+---+
| 2 |
+---+
| 2 |
+---+

我已经尝试过将表格保存为可以通过json.load作为字典加载到python的格式:

import json
with open('impala_results') as f:
     data = json.load(f)

通过类似的操作:

echo -e "{\"a\": $a, \"b\": $b}" > /path/to/impala_results

为了保存结果,但是无论尝试什么,我都会遇到错误,认为这可能是unicode编码问题。

ValueError: Invalid control character at: line 1 column 152 (char 151)
ValueError: No JSON object could be decoded

我的意思是,我不相信这一定是最好的处理方法,但是如果可以将表作为字典中的单独且可访问的对象加载,则解析表会更容易。可能还有另一种方法,如果是这样,请告诉我。

我确实想避免保存20个以上的.csv文件。

谢谢

python json bash dictionary impala
1个回答
0
投票

我认为此问题的潜在解决方案是使用类似于以下代码的自定义分隔符将所有查询结果保存在一个.csv中:

impala-shell -q "SELECT * FROM tbl; SELECT '~'; SELECT * FROM tbl2; SELECT '~';" -o /path/to/results.csv -B --output_delimiter=',' --print_header -o 

然后在python中使用:

with open('results.csv', mode='r') as csv_file:
    results = csv_file.read() 

并使用自定义定界符将结果分成单个列表:

results = [i.split("\n") for i in im.split("~")]
© www.soinside.com 2019 - 2024. All rights reserved.