Запрос в свободной форме Sqoop не работает

Ниже приведен запрос, который я пытаюсь выполнить в виртуальной машине быстрого запуска Cloudera.

sqoop import --username training --password training --connect jdbc:mysql://localhost/loudacre --target-dir /sample --split-by account.acct_num --query 'выбрать учетные записи.first_name ИЗ учетных записей ПРИСОЕДИНЯЙТЕСЬ к accountdevice ON (accounts.acct_num = accountdevice.account_id) ГДЕ $УСЛОВИЯ' kquote

Ниже приведена структура двух таблиц, используемых в запросе.

mysql> describe accounts;
+----------------+--------------+------+-----+---------+-------+
| Field          | Type         | Null | Key | Default | Extra |
+----------------+--------------+------+-----+---------+-------+
| acct_num       | int(11)      | NO   | PRI | NULL    |       |
| acct_create_dt | datetime     | NO   |     | NULL    |       |
| acct_close_dt  | datetime     | YES  |     | NULL    |       |
| first_name     | varchar(255) | NO   |     | NULL    |       |
| last_name      | varchar(255) | NO   |     | NULL    |       |
| address        | varchar(255) | NO   |     | NULL    |       |
| city           | varchar(255) | NO   |     | NULL    |       |
| state          | varchar(255) | NO   |     | NULL    |       |
| zipcode        | varchar(255) | NO   |     | NULL    |       |
| phone_number   | varchar(255) | NO   |     | NULL    |       |
| created        | datetime     | NO   |     | NULL    |       |
| modified       | datetime     | NO   |     | NULL    |       |
+----------------+--------------+------+-----+---------+-------+
12 rows in set (0.00 sec)

 mysql> describe accountdevice;
+-------------------+--------------+------+-----+---------+----------------+
| Field             | Type         | Null | Key | Default | Extra          |
+-------------------+--------------+------+-----+---------+----------------+
| id                | int(11)      | NO   | PRI | NULL    | auto_increment |
| account_id        | int(11)      | NO   | MUL | NULL    |                |
| device_id         | int(11)      | NO   | MUL | NULL    |                |
| activation_date   | datetime     | NO   |     | NULL    |                |
| account_device_id | varchar(255) | NO   |     | NULL    |                |
+-------------------+--------------+------+-----+---------+----------------+

Я получаю следующее исключение

SQLSyntaxErrorException: Unknown column 't1.acct_num' in 'field list'
16/10/15 13:48:12 ERROR tool.ImportTool: Encountered IOException running import job: java.io.IOException: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Unknown column 't1.acct_num' in 'field list'

Может ли кто-нибудь помочь?


person Deepak_Spark_Beginner    schedule 15.10.2016    source источник
comment
пожалуйста, сохраните --split-by account.acct_num после --query и попробуйте один раз, например --query 'выберите account.first_name FROM account JOIN accountdevice ON (accounts.acct_num = accountdevice.account_id) WHERE $CONDITIONS' --split-by account.acct_num   -  person Arunakiran Nulu    schedule 16.10.2016
comment
Ниже приведена ошибка, которую я получаю после выполнения вышеупомянутого совета. MySQLSyntaxErrorException: неизвестный столбец 't1.acct_num' в 'списке полей' .MySQLSyntaxErrorException: неизвестный столбец «t1.acct_num» в «списке полей»   -  person Deepak_Spark_Beginner    schedule 16.10.2016
comment
добавьте --verbose в конец запроса и поделитесь логами консоли.   -  person Dev    schedule 16.10.2016
comment
это сработало, когда я добавил столбец, который я использовал в разделении в операторе выбора в запросе произвольной формы.   -  person Deepak_Spark_Beginner    schedule 16.10.2016


Ответы (1)


Это ожидаемое поведение.

Во-первых, sqoop будет извлекать метаданные (детали столбцов) из СУБД на основе вашего запроса.

Используя запрос:

select accounts.first_name FROM accounts JOIN accountdevice
 ON (accounts.acct_num = accountdevice.account_id) WHERE 1 = 0

вы видите, что $CONDITIINS заменено на 1 = 0 для получения метаданных.

Теперь ваш запрос вернет только 1 столбец first_name, и вы разделите его на acct_num, который не запрашивается из таблицы СУБД. Вот почему вы получаете сообщение об ошибке Неизвестный столбец.

Поэтому убедитесь, что вы также разделяете SELECT по столбцам в своем SQL-запросе.

person Dev    schedule 16.10.2016
comment
Большое спасибо за подробное объяснение. - person Deepak_Spark_Beginner; 17.10.2016