2017-08-17 1 views
0

Comment puis-je mettre à jour les données dans un fichier HDFS similaire aux données de la table MySQL? J'ai vérifié sur Internet, mais tous les exemples donnés sont avec - incrémental lastmodified exemple.L'importation incrémentielle Sqoop et la mise à jour ne fonctionne pas

Où dans mon cas ma table MySQL ne contient pas de colonne de date ou d'horodatage. Comment est-ce que je peux mettre à jour les données dans le dossier de HDFS semblable aux données dans la table de MySQL qui ne contient pas la colonne de date?

J'ai table MySQL comme ci-dessous

mysql> select * from employee; 
+----+--------+--------+------+-------+-----------+ 
| id | name | gender | age | state | language | 
+----+--------+--------+------+-------+-----------+ 
| 1 | user1 | m  | 25 | tn | tamil  | 
| 2 | user2 | m  | 41 | ka | tamil  | 
| 3 | user3 | f  | 47 | kl | tamil  | 
| 4 | user4 | f  | 52 | ap | telugu | 
| 5 | user5 | m  | 55 | ap | telugu | 
| 6 | user6 | f  | 43 | tn | tamil  | 
| 7 | user7 | m  | 34 | tn | malayalam | 
| 8 | user8 | f  | 33 | ap | telugu | 
| 9 | user9 | m  | 36 | ap | telugu | 

J'ai importé à HDFS en utilisant la commande ci-dessous.

[[email protected] ~]$ sqoop import --connect jdbc:mysql://localhost:3306/mydatabase --username root --table employee --as-textfile --target-dir hdfs://localhost.localdomain:8020/user/cloudera/data/employee 

Les données sont importées comme prévu.

[[email protected] ~]$ hadoop fs -ls /user/cloudera/data/employee/ 
Found 6 items 
-rw-r--r-- 3 cloudera cloudera   0 2017-08-16 23:57 /user/cloudera/data/employee/_SUCCESS 
drwxr-xr-x - cloudera cloudera   0 2017-08-16 23:56 /user/cloudera/data/employee/_logs 
-rw-r--r-- 3 cloudera cloudera  112 2017-08-16 23:56 /user/cloudera/data/employee/part-m-00000 
-rw-r--r-- 3 cloudera cloudera  118 2017-08-16 23:56 /user/cloudera/data/employee/part-m-00001 
-rw-r--r-- 3 cloudera cloudera  132 2017-08-16 23:56 /user/cloudera/data/employee/part-m-00002 
-rw-r--r-- 3 cloudera cloudera  136 2017-08-16 23:56 /user/cloudera/data/employee/part-m-00003 

Maintenant, j'ai mis à jour les valeurs et les valeurs insérées dans la table mysql. Mais cette table ne contient pas de colonne de date.

mysql> update employee set language = 'marathi' where id >= 8; 
mysql> insert into employee (name,gender,age,state,language from people) values('user11','f','25','kl','malayalam'); 

Je sais que les nouvelles valeurs introduites peuvent être insérées à l'aide hdfs --check-colonne, append incrémentale et la valeur --last. Mais comment puis-je mettre à jour les valeurs dans hdfs pour les lignes 8 et 9 de la table mysql mises à jour en 'marathi'? En outre, ma table d'employés ne contient pas de colonne de date ou d'horodatage.

Répondre

0

Pour ligne nouvellement insérée, vous pouvez toujours utiliser:

--incremental append --check-column id --last-value 9

Mais pour obtenir des mises à jour de la table ne pas avoir updated_at colonne, je ne pense pas possible des thats. Si votre table est très petite, alors faites juste un vidage complet à chaque fois.

Ou si vous pouvez en quelque sorte de maintenir une trace de ce que tous les ids mis à jour depuis la dernière se sont l'importation, puis nous allons vous dire savoir ids 7, 3, 4 and 8 mis à jour depuis la dernière se sont import, vous pouvez utiliser le minimum de ids mis à jour et utiliser comme --last-value. Donc, votre config sera:

-- incremental append --check-column id --last-value 3 --merge-key id

--merge-key id racontera Sqoop à merge les nouvelles données supplémentaires à l'ancienne base de la colonne id.