Sqoop导入数据到Hive的底层细节问题
1.导入语句
注意:该语句未指定hive-table表的数据库名,所以会导入到默认的default数据库下。
sqoop import \
--connect jdbc:mysql://192.168.10.203:3306/test?tinyInt1isBit=false\&zeroDateTimeBehavior=convertToNull\&dontTrackOpenResources=true\&defaultFetchSize=1000\&useCursorFetch=true \
--driver com.mysql.jdbc.Driver \
--username root \
--password-file /user/kms/sqoop.pwd \
--table employee \
--hive-import \
--hive-overwrite \
--hive-table employee \
--fields-terminated-by "\t" \
--null-string '\\N' \
--null-non-string '\\N'
2.Sqoop是如何将表导入Hive的
sqoop会先将表导入到HDFS,默认情况下(即不指定导入的路径地址),会在当前用户的目录下生成与表名相同的文件夹,比如当前用户为kms,导入的表为employee,则会先将导入的文件放在HDFS的/user/kms/employee路径下,导入过程中在该路径下生成_temporary文件,完成之后会生成完整的小文件。最后会把这些文件放在hive表的存储路径下,默认会在hdfs://kms-1.apache.com:8020/user/hive/warehouse/employee下,底层会执行"LOAD DATA INPATH 'hdfs://kms-1.apache.com:8020/user/kms/employee' OVERWRITE INTO TABLE `employee` "命令,如果该Hive表不存在,则会在default数据库下自动创建同名的表,其中字段的分隔符为fields-terminated-by指定的分隔符,同时会把数据类型为DATE
, TIME
, 和 TIMESTAMP
类型的字段转为String类型。如果hive表存在,则不自动创建。
如果在--hive-table 参数指定了表所在的数据库,比如--hive-table test.employee ,则会将数据导入到该表指定的路径下。
如果指定了--target-dir(路径不能存在),则会在该路径下生成临时的文件,然后将该文件load进hive表。
公众号「大数据技术与数仓」
专注分享数据仓库与大数据技术