mysql-sqoop merge-key创建多个零件文件,而不是一个不能使用merge-key的文件

理想情况下,当我们在不使用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,小丑

这有些不同,所以我不确定要说些什么.在任何情况下,一个文件都不是具有大量数据的有效假设.您的语句可以使用其他参数,但这也可以.

这里的线索是通过合并要求更新不可变系统,这些合并要求可以通过外部表命令根据位置切换不同的目标.

上一篇:java-SqoopOptions类是否有替代方法


下一篇:sqoop 1.99 集群安装及迁移mysql 到hive