本文使用Sqoop从MySQL向Hive导入数据,测试对各种分隔符场景的支持情况。
1.1 Sqoop支持的场景
本节测试使用的MySQL数据如下图所示:
1.1.1 测试是否支持tab字符
Sqoop脚本:
./sqoop import --connectjdbc:mysql://192.168.0.151:3306/wht --username root --password root --tablepeople --fields-terminated-by'\t' --hive-import --hive-tabledb01.people02 --hive-overwrite -m 1
Sqoop导出的文本文件内容:
HQL查询结果:
结论:支持
Sqoop脚本中支持tab字符
1.1.2 测试是否支持八进制ASCII字符
Sqoop脚本:
./sqoop import --connect jdbc:mysql://192.168.0.151:3306/wht--username root --password root --table people --fields-terminated-by '\001' --hive-import --hive-table db01.people03--hive-overwrite -m 1
Sqoop导出的文本文件内容:
HQL查询结果:
结论:支持
Sqoop脚本中支持8进制表示的ASCII字符。
1.1.3 测试是否支持十六进制ASCII字符
Sqoop脚本:
./sqoop import --connectjdbc:mysql://192.168.0.151:3306/wht --username root --password root --tablepeople --fields-terminated-by'\0x002' --hive-import--hive-table db01.people04 --hive-overwrite -m 1
Sqoop导出的文本文件内容:
HQL查询结果:
结论:支持
Sqoop脚本中支持16进制表示的ASCII字符。
1.1.4 测试是否支持特殊字符——反斜杠\
Sqoop脚本:
./sqoop import --connectjdbc:mysql://192.168.0.151:3306/wht --username root --password root --tablepeople --fields-terminated-by'\\' --hive-import --hive-tabledb01.people05 --hive-overwrite -m 1
Sqoop导出的文本文件内容:
HQL查询结果:
结论:支持
Sqoop脚本中支持特殊字符反斜杠,但使用时需要进行转义。
1.1.5 测试是否支持特殊字符——双引号"
Sqoop脚本:
./sqoop import --connectjdbc:mysql://192.168.0.151:3306/wht --username root --password root --tablepeople --fields-terminated-by'\"' --hive-import--hive-table db01.people06 --hive-overwrite -m 1
Sqoop导出的文本文件内容:
HQL查询结果:
结论:支持
Sqoop脚本中支持特殊字符双引号,但使用时需要进行转义。
1.2 Sqoop不支持的场景
本节测试使用的MySQL数据如下图所示:
1.2.1 测试是否支持多个字符组成的分隔符
Sqoop脚本:
./sqoop import --connectjdbc:mysql://192.168.0.151:3306/wht --username root --password root --tablepeople --fields-terminated-by'++' --hive-import --hive-tabledb01.people09 --hive-overwrite -m 1
Sqoop导出的文本文件内容:
HQL查询结果:
结论:不符合预期
Sqoop脚本中不支持将多个字符作为分隔符,当分隔符为多个字符时,会自动截取第一个字符作为分隔符,如下日志所示:
1.2.2测试源字段内容中包含分隔符
Sqoop脚本:
原始数据库中有date字段,格式为YYYY-MM-DD,测试使用-作为分隔符
./sqoop import --connectjdbc:mysql://192.168.0.151:3306/wht --username root --password root --tablepeople --fields-terminated-by'-' --hive-import --hive-tabledb01.people08 --hive-overwrite -m 1
Sqoop导出的文本文件内容:
HQL查询结果:
结论:不符合预期
当原始字段中含有分隔符时,虽然可以正常导出文件,但是SQL会将字段中出现的分隔符作为字段的分隔符,从而引起数据错位,最终导出数据查询失败,即当一行文本中以指定的分隔符分割后的字段多余schema中的字段数时,则截断显示。
1.2.3 使用包围字符enclosingcharacter
Sqoop脚本:
原始数据库中有date字段,格式为YYYY-MM-DD,测试使用-作为分隔符,以\作为转义字符,以"作为导出字段的包围字符
./sqoop import --connectjdbc:mysql://192.168.0.151:3306/wht --username root --password root --tablepeople --fields-terminated-by'-' --escaped-by \\ --enclosed-by '\"' --hive-import --hive-tabledb01.people10 --hive-overwrite -m 1
Sqoop导出的文本文件内容:
HQL查询结果:
结论:不符合预期
1. 导出的文件中原来的所有字段都被指定的包围字段包围。
2. 在执行SQL时却将包围字段当做普通字段来处理,从而引发如下问题:
- 原有的数值类型不能被正常解析,从而显示为NULL
- 原始字段中包含的分隔符依然会被当做字段分隔符,这样会导致成对的”被截断,即”将被Hive视作数据的一部分