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

7tofc5zh  于 2021-06-26  发布在  Impala
关注(0)|答案(1)|浏览(674)

我正在bash脚本中运行多个impala查询,将它们保存到变量中,在terminal中打印结果,此外,还尝试将存储在变量中的输出表保存到一个.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作为dict加载到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

我的意思是,我不认为这是做事情的最好方法,但是如果可以将表作为单独的可访问对象加载到dict中,那么解析表就更容易了。很可能还有另一种方法,如果有,请告诉我。
但我真的不想保存20+个.csv文件。
谢谢

ax6ht2ek

ax6ht2ek1#

我认为这个问题的一个潜在解决方案是使用类似于以下代码的自定义分隔符将所有查询结果保存在一个.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("~")]

相关问题