Sqoop合并HDFS增量数据时jar-file与class-name参数疑问
关于Sqoop Merge中
--jar-file和--class-name参数的解惑 我来帮你拆解这两个参数的作用,以及怎么找到/生成对应的Jar文件和类名:
核心本质
Sqoop Merge 是通过Java实体类来解析HDFS上的数据文件的,这两个参数就是告诉Sqoop:用哪个Java类来解析你的数据,以及这个类所在的Jar文件路径。而这个Java类,其实是对应你要合并的数据库表的实体类——也就是Sqoop在导入数据时自动生成的表结构映射类。
具体参数解释
--class-name:指定对应数据库表的Java实体类名称。比如你要合并的是student表,默认情况下Sqoop会生成名为Student的类(首字母大写的表名);如果之前导入时用--class-name指定过自定义类名,就用那个名字。示例里的TIME应该是用户之前生成类时指定的名称,或者是对应表的某个核心字段名?(更合理的应该是对应student表的类名,比如Student)--jar-file:包含上述Java类的Jar文件路径。Sqoop在生成Java类时会自动编译并打包成Jar,默认会放在临时目录(比如示例里的/tmp/sqoop-ambari-qa/compile/.../TIME.jar),但临时目录的文件可能被系统清理,所以更稳妥的方式是自己生成并指定固定路径。
实操步骤:生成自己的Jar和类
如果你找不到之前的临时Jar,建议用sqoop codegen命令重新生成对应表的Java类和Jar:
- 执行
codegen命令生成类和Jar(替换成你的数据库信息):
sqoop codegen \ --connect jdbc:mysql://你的数据库地址:端口/库名 \ --username 用户名 \ --password 密码 \ --table student \ --bindir /home/sqoop/student_jars \ # 自定义Jar保存目录,避免临时文件被清理 --class-name Student \ # 指定类名,后续merge要用这个名字
执行后,/home/sqoop/student_jars目录下会生成Student.jar和对应的Java源文件。
- 用生成的Jar和类名执行Merge:
sqoop merge \ --new-data /apps/hive/warehouse/student/part-m-00000 \ --onto /apps/hive/warehouse/student/part-m-00000_copy_1 \ --target-dir /tmp/sqoop_merge \ --jar-file /home/sqoop/student_jars/Student.jar \ --class-name Student \ --merge-key TIME # 这里的TIME是你用来判断增量的唯一键/更新时间列,确保它在Student类中存在对应字段
额外注意
--merge-key必须是你的表(以及对应Java类)中存在的字段,Sqoop会用这个字段判断:新数据(--new-data)中相同merge-key的记录会覆盖旧数据(--onto)中的记录。- 如果之前做过
sqoop import时没有跳过代码生成(默认不跳过),也可以在Sqoop的临时工作目录找到对应的Jar,但临时路径不稳定,还是建议手动生成到固定目录。
内容的提问来源于stack exchange,提问作者Tia
相关产品推荐
相关产品推荐

