首页 > 解决方案 > 保存多个 impala 查询输出以在 python 中使用(不将每个单独的查询保存为 .csv)

问题描述

我在 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 文件。

谢谢

标签: pythonjsonbashdictionaryimpala

解决方案


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

推荐阅读