Сохраните несколько результатов запроса impala для использования в python (без сохранения каждого отдельного запроса в формате .csv) - PullRequest
0 голосов
/ 29 марта 2020

Я выполняю несколько запросов impala в сценарии bash, сохраняю их в переменные, распечатываю результаты в терминале и, кроме того, пытаюсь сохранить выходные таблицы, хранящиеся в переменных, в файле .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 |
+---+

Я пробовал сохранять таблицы в формате, который может быть загружен в python как диктовку с json .load:

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.

Спасибо

1 Ответ

0 голосов
/ 29 марта 2020

Я думаю, что потенциальное решение этой проблемы - сохранить все результаты запроса в одном .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("~")]
...