Экспорт Sqoop с использованием ключа обновления

Мне нужно экспортировать файл HDFS в MySql.
Допустим, мой файл HDFS:

1,abcd,23
2,efgh,24
3,ijkl,25
4,mnop,26
5,qrst,27

и скажите, что моя схема базы данных Mysql:

+-----+-----+-------------+
| ID  | AGE |    NAME     |
+-----+-----+-------------+
|     |     |             |
+-----+-----+-------------+

Когда я вставляю с помощью следующей команды Sqoop:

sqoop export \
--connect jdbc:mysql://localhost/DBNAME \
--username root \
--password root \
--export-dir /input/abc \
--table test \
--fields-terminated-by "," \
--columns "id,name,age"

Он работает нормально и вставляется в базу данных.

Но когда мне нужно обновить уже существующие записи, я должен использовать --update-key и --columns.

Теперь, когда я пытаюсь обновить таблицу, используя следующую команду:

sqoop export \
--connect jdbc:mysql://localhost/DBNAME \
--username root \
--password root \
--export-dir /input/abc \
--table test \
--fields-terminated-by "," \
--columns "id,name,age" \
--update-key id

Я столкнулся с проблемой, когда данные не обновляются в столбцах, как указано в --columns

Я делаю что-то не так?

Разве мы не можем обновить базу данных таким образом? Файл HDFS должен находиться в схеме Mysql только для обновления?

Есть ли другой способ добиться этого?


person Y.Prithvi    schedule 17.09.2014    source источник
comment
На всякий случай, если вы все еще ищете ответ, мне понадобятся дополнительные разъяснения. Вы получаете какие-либо ошибки или просто не обновляете столбцы, как вы ожидаете?   -  person blazy    schedule 29.04.2015


Ответы (4)


4b. Обновите данные из HDFS в таблицу в реляционной базе данных.

Создайте таблицу emp table в тестовой базе данных mysql

create table emp
(
id int not null primary key,
name varchar(50)
);

vi emp --> создать файл с содержимым ниже

1,Thiru
2,Vikram
3,Brij
4,Sugesh

Переместите файл в hdfs

hadoop fs -put emp <dir>

Выполните приведенное ниже задание sqoop, чтобы экспортировать данные в mysql.

sqoop export --connect <jdbc connection> \
--username sqoop \
--password sqoop \
--table emp \
--export-dir <dir> \
--input-fields-terminated-by ',';

Проверьте данные в таблице mysql

mysql> select * from emp;

+----+--------+
| id | name   |
+----+--------+
|  1 | Thiru  |
|  2 | Vikram |
|  3 | Brij   |
|  4 | Sugesh |
+----+--------+

обновите файл emp и переместите обновленный файл в hdfs. содержимое обновленного файла

1,Thiru
2,Vikram
3,Sugesh
4,Brij
5,Sagar

Экспорт Sqoop для upsert — обновите, если ключ совпадает, иначе вставьте.

sqoop export --connect <jdbc connection> \
--username sqoop \
--password sqoop \
--table emp \
--update-mode allowinsert \
--update-key id \
--export-dir <dir> \
--input-fields-terminated-by ',';

Note: --update-mode <mode> - we can pass two arguments "updateonly" - to update the records. this will update the records if the update key matches.
if you want to do upsert (If exists UPDATE else INSERT) then use "allowinsert" mode.
example: 
--update-mode updateonly \ --> for updates
--update-mode allowinsert \ --> for upsert

проверить результаты:

mysql> select * from emp;
+----+--------+
| id | name   |
+----+--------+
|  1 | Thiru  |
|  2 | Vikram |
|  3 | Sugesh |--> Previous value "Brij"
|  4 | Brij   |--> Previous value "Sugesh"
|  5 | Sagar  |--> new value inserted
+----+--------+
person Thiru    schedule 22.07.2016

Просто попробуйте с --update-key primary_key

 sqoop export --connect jdbc:mysql://localhost/DBNAME -username root -password root --export-dir /input/abc --table test --fields-terminated-by "," --update-key id 

Это сработало для меня. Он обновляет все записи, соответствующие первичному ключу. (Он может не вставлять новые данные)

Используйте --update-mode updateonly/allowinsert с умом

person rinuthomaz    schedule 17.06.2015

Вы можете попробовать с --input-fields-terminated-by. В настоящее время вы используете fields-terminated-by, предназначенные для импорта.

person Srini Challa    schedule 10.11.2016

На самом деле я пробовал это на Sqoop, используя несколько способов. Update-Key может обновлять только те столбцы, которые уже присутствуют в таблице, и не может их вставлять, если вы также не укажете Update-Mode для разрешения вставки (который поддерживается не всеми базами данных). Если вы на самом деле попытаетесь обновить с помощью ключа обновления, он обновит строки для указанного ключа в ключе обновления.

person Haider Ali    schedule 10.05.2017