Загрузка данных с вложенным массивом из CSV в базу данных Vertica

#python #csv #vertica #vertica-python

Вопрос:

Я пытаюсь скопировать данные из CSV в базу данных Vertica с COPY помощью запроса, все данные копируются нормально, за исключением того, что если есть список или словарь, он копирует их в виде строки (т. е.: "{'k1': 'v1'}" , "[1, 2, 3]" ). Поскольку для Vertica нет типа данных, подобного jsonb (как в PostgreSQL), поэтому я должен принять его как long varchar .

Формат файлов CSV.

 "[1, 2, 3]","{"nested_prop_1": "nested_value_1", "nested_prop_2": "nested_value_2", "nested_prop_3": {"multi_nested_prop_1": "multi_value_1", "multi_nested_prop_2": "multi_value_2"}}","{"key_1": "value_1"}","{"key_1": "value_1"}",1
 

Примечание: Удаление двойных кавычек из приведенного выше списка и словаря не сработает, так как в конечном итоге они будут сохранены под типом данных varchar.

Копирование данных с помощью следующих:

 ...
copy_sql = ("COPY {table}({fields}) FROM LOCAL STDIN DELIMITER ',' ESCAPE AS '\' ENCLOSED BY '"'"
            .format(table=temp_table, fields=', '.join(self.column_names())))

with open(file, "r") as fs:
    cur.execute(copy_sql, copy_stdin=[fs], buffer_size=65536)
...
 

Как только курсор будет установлен в "dict" so fetchall , он вернется OrderedDict

 >>> dict(cur.execute(f'SELECT * FROM {temp_table}').fetchall()[0])
{
    'c_array': '[1, 2, 3]', 
    'c_nested_object': '{"nested_prop_1": "nested_value_1", "nested_prop_2": "nested_value_2",
                         "nested_prop_3": {"multi_nested_prop_1": "multi_value_1",
                                           "multi_nested_prop_2": "multi_value_2"}}', 'c_object': '{"key_1": "value_1"}', 'c_object_with_props': '{"key_1": "value_1"}', 
    'c_pk': 1
}
 

Если это невозможно сделать в Vertica, то есть ли какой-либо обходной путь для того же самого?

Последнее, о чем я могу подумать, — это изменить возвращаемое значение fetchall , хотя я думаю, что должен быть лучший способ. Не стесняйтесь также давать предложения и идеи.