理想情况下,当我们在不使用merge-key的情况下运行增量文件时,它将创建带有附加数据集的新文件,但是如果我们使用merge-key,则它将创建新的整个数据集,包括仅在一个文件中的先前数据集.但是当我在sqoop工作中使用增量追加时,我没有得到一个零件文件.以下是我的步骤:
1)初始数据:
mysql> select * from departments_per;
+---------------+-----------------+
| department_id | department_name |
+---------------+-----------------+
| 2 | Fitness |
| 3 | Footwear |
| 4 | Apparel |
| 5 | Golf |
| 6 | Outdoors |
| 7 | Fan Shop |
+---------------+-----------------+
2)sqoop命令最初将数据导入hdfs:
sqoop import \
--connect jdbc:mysql://localhost/practice \
--username root \
--password cloudera \
--table departments_per \
--target-dir /departments \
-m 1
现在,当我看到hdfs下的目录部门时,我可以看到一个部分文件,这很好.
3)现在我在mysql中更新我的初始数据:
mysql> select * from departments_demo;
+---------------+-----------------+
| department_id | department_name |
+---------------+-----------------+
| 2 | Fitness |
| 3 | Footwear |
| 4 | Apparel |
| 5 | Golf |
| 6 | Outdoors |
| 7 | Fan |
| 8 | Tushar MC |
+---------------+-----------------+
4)现在,我创建增量追加作业并执行它:
sqoop job --create appendJobs12 \
-- import \
--connect jdbc:mysql://localhost/practice \
--username root \
--password cloudera \
--table departments_demo \
-m 1 \
--target-dir /departments \
--incremental append \
--merge-key department_id \
--check-column department_id \
--last-value 0
sqoop job --exec appendJobs12
5)即使我使用了合并键概念,我也可以在hdfs目录中看到两个部分文件.
[cloudera@quickstart ~]$hadoop fs -ls /departments
Found 3 items
-rw-r--r-- 1 cloudera supergroup 0 2018-10-04 00:31 /departments/_SUCCESS
-rw-r--r-- 1 cloudera supergroup 60 2018-10-04 00:31 /departments/part-m-00000
-rw-r--r-- 1 cloudera cloudera 67 2018-10-04 00:37 /departments/part-m-00001
当我显示数据时,如下所示:
[cloudera@quickstart ~]$hadoop fs -cat /departments/part-m-00000
2,Fitness
3,Footwear
4,Apparel
5,Golf
6,Outdoors
7,Fan Shop
[cloudera@quickstart ~]$hadoop fs -cat /departments/part-m-00001
2,Fitness
3,Footwear
4,Apparel
5,Golf
6,Outdoors
7,Fan
8, Tushar MC
其中一个零件文件包含初始数据,第二个零件文件包含更新的数据.谁能告诉我我要去哪里错了,因为我无法使用更新的数据集获得一个零件文件.提前致谢
解决方法:
我对此进行了研究,并发现与您的方法相同的错误.因此,这是不正确的-阅读各种内容我不得不说,我认为这还不是很清楚.无论如何.
我觉得中间目标目录需要外部表和一些LINUX脚本.
因此,1)我在mysql中添加了数据,2)进行了sqoop导入,然后3)在mysql中进行了更新,再进行了4)像您所做的那样进行了另一次增量导入,我认为这不是很正确,但是您想要更新,所以就可以了,其次是5)代码生成,最后是6)合并合并.
这些是主要步骤:
初始导入
sqoop import -m 1 --connect jdbc:mysql://quickstart:3306/retail_db --username=retail_dba --password=cloudera --table ged --warehouse-dir=/user/hive/warehouse --create-hive-table --hive-import --fields-terminated-by ',' --hive-drop-import-delims
像您一样增加负荷
sqoop import -m 1 --connect jdbc:mysql://quickstart:3306/retail_db --username=retail_dba --password=cloudera --table ged --warehouse-dir=/user/hive/warehouse --fields-terminated-by ',' --hive-drop-import-delims --last-value 0 --merge-key id --incremental append --check-column id
代码生成
sqoop codegen --connect jdbc:mysql://quickstart:3306/retail_db --username=retail_dba --password=cloudera --table ged
合并
sqoop merge --new-data /user/hive/warehouse/ged --onto /user/hive/warehouse/new_ged --merge-key id --target-dir /user/hive/merged/ged2 --jar-file /tmp/sqoop-cloudera/compile/c8d374075351d228c50d89354959762e/ged.jar -class-name ged
结果:
[cloudera @ quickstart〜] $hadoop fs -cat / user / hive / merged / ged2 / *
1,YYY
2,彼得
3,鲍比
4,玛丽亚
5,笑话
6,小丑
因此我本来有1,XXX但没有6,小丑
这有些不同,所以我不确定要说些什么.在任何情况下,一个文件都不是具有大量数据的有效假设.您的语句可以使用其他参数,但这也可以.
这里的线索是通过合并要求更新不可变系统,这些合并要求可以通过外部表命令根据位置切换不同的目标.