Отправка / экспорт большого массива данных из R в базу данных Vertica

#r #database #bulkinsert #dbi #vertica

#r #База данных #bulkinsert #dbi #vertica

Вопрос:

У меня есть фрейм данных из 10 строк, который необходимо загрузить обратно из R в базу данных Vertica.

DBwrite() Функция из DBI сталкивается с проблемами с памятью, и я попытался увеличить объем памяти до 16 гб с помощью

 options(java.parameters = c("-XX: UseConcMarkSweepGC", "-Xmx16g"))
 

Тем не менее, процесс сталкивается с проблемой памяти. Я планирую использовать опцию массового копирования vertica для копирования CSV-файла для создания таблицы.

  1. Я создал пустую таблицу в vertica
  2. Когда я выполняю запрос
 dbSendQuery(vertica, "COPY hpcom_usr.VM_test FROM LOCAL '/opt/mount1/musoumit/MarketBasketAnalysis/Code/test.csv'  enclosed by '"' DELIMITER ',' direct REJECTED DATA './code/temp/rejected.txt' EXCEPTIONS './code/temp/exceptions.txt'")
 

Я сталкиваюсь с этой ошибкой.

Ошибка в .verify.JDBC.result(r, «Не удалось получить результирующий набор JDBC»: Не удалось получить результирующий набор JDBC ОШИБКА JDBC: [Vertica]JDBC Ожидался, но не был сгенерирован из запроса «КОПИРОВАТЬ hpcom_usr.VM_test ИЗ LOCAL ‘/opt/mount1/musoumit/MarketBasketAnalysis/Code/test.csv’ заключен в ‘»‘ РАЗДЕЛИТЕЛЬ ‘,’ прямые ОТКЛОНЕННЫЕ ДАННЫЕ’./code/temp/отклонено.txt’ИСКЛЮЧЕНИЯ’./code/temp/exceptions.txt ‘». Запрос не выполнен.

Пожалуйста, помогите разобраться, что я здесь делаю не так. Vertica также предоставляет опцию STDIN. Ссылка

Пожалуйста, помогите мне, как я могу это выполнить.

Моя среда.

CENT OS 7 R 3.6.3 (здесь нет R Studio, я должен выполнить это из CLI) Tidyverse 1.0.x Драйвер Vertica 9.x Системная память 128 ГБ и 28-ядерная система.

Комментарии:

1. Я не думаю, что «копировать из локального» — это sql-запрос. Это больше похоже на команду, которая будет использоваться с их конкретным программным обеспечением драйвера.

2. Обычно я использую его на стороне клиента, например DBeaver, и он работает. итак, найдите способ, чтобы запрос указывал на файл внутри R. В качестве альтернативы существует стандартный подход, который я не могу реализовать.

Ответ №1:

Ваша проблема в том, что вы запускаете dbSendQuery() , который живет со следующими dbFetch() и конечными dbClearResult() — но только для запросов SQL-операторов — тех, которые фактически возвращают результирующий набор.

COPY <table> FROM [LOCAL] 'file.ext' ... Команда Vertica обрабатывается как команда DML. И для них — как говорится в этом документе …

https://www.rdocumentation.org/packages/DBI/versions/0.5-1/topics/dbSendQuery

.. вам необходимо использовать dbSendStatement() инструкции для обработки данных.

Попробуйте сделать это таким образом — удачи…

Ответ №2:

 dbSendUpdate(vertica, "COPY hpcom_usr.VM_test FROM LOCAL '/opt/mount1/musoumit/MarketBasketAnalysis/Code/test.csv'  enclosed by '"' DELIMITER ',' direct REJECTED DATA './code/temp/rejected.txt' EXCEPTIONS './code/temp/exceptions.txt'")
 

вместо dbSendQuery сделал трюк для меня.