理想情况下,当我们在不使用 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) 最初将数据导入到hdfs的sqoop命令:
sqoop import \
--connect jdbc:mysql://localhost/practice \
--username root \
--password cloudera \
--table departments_per \
--target-dir /departments \
-m 1
现在,当我看到 hdfs 下的目录 departments 时,我可以看到一个很好的部分文件。
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 目录中看到两个部分文件,即使我使用了 merge-key
概念。
[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) codegen,最后是 6) sqoop MERGE。
主要步骤如下:
初始导入
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,年年年 2、彼得 3、鲍比 4、玛丽亚 5、笑话 6、 clown
因此我最初有 1, XXX 而不是 6, Joker
这有点不同,所以我不确定该说些什么。在任何情况下,1 个文件都不是具有大量数据的有效假设。您的陈述可能适用于额外的参数,但这也适用。
这里的线索是通过合并更新不可变系统,需要不同的目标,这些目标可以通过外部表命令根据位置进行切换。
关于mysql - sqoop merge-key 创建多个部分文件而不是一个不符合使用 merge-key 目的的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52641463/