#r #database #bulkinsert #dbi #vertica
#r #База данных #bulkinsert #dbi #vertica
Вопрос:
У меня есть фрейм данных из 10 строк, который необходимо загрузить обратно из R в базу данных Vertica.
DBwrite()
Функция из DBI сталкивается с проблемами с памятью, и я попытался увеличить объем памяти до 16 гб с помощью
options(java.parameters = c("-XX: UseConcMarkSweepGC", "-Xmx16g"))
Тем не менее, процесс сталкивается с проблемой памяти. Я планирую использовать опцию массового копирования vertica для копирования CSV-файла для создания таблицы.
- Я создал пустую таблицу в vertica
- Когда я выполняю запрос
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 сделал трюк для меня.