理想情况下,当我们在不使用merge-key
的情况下运行增量时,它将创建具有附加数据集的新文件,但是如果使用merge-key
,则它将仅在一个文件中创建包括先前数据集的新整个数据集。 。但是当我在sqoop工作中使用incremental append
时,我没有得到一个零件文件。以下是我的步骤:
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)即使我使用merge-key
概念,也可以在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
其中一个部分文件包含初始数据,第二个文件包含更新的数据。谁能告诉我我要去哪里错了,因为我无法使用更新的数据集获得一个零件文件。预先感谢
答案 0 :(得分:0)
我对此进行了研究,并发现与您的方法相同的错误。因此,这是不正确的-阅读各种内容我不得不说,我认为这还不是很清楚。无论如何。
给人的印象是,中间目标目录需要外部表和一些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
Codegen
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,小丑
这有些不同,所以我不确定要说什么。在任何情况下,一个文件都不是具有大量数据的有效假设。您的语句可以使用其他参数,但这也可以。
这里的线索是通过合并要求更新不可变系统,这些合并要求可以通过外部表命令根据位置切换不同的目标。