SQOOP对分隔符支持情况的验证

本文使用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视作数据的一部分





猜你喜欢

转载自blog.csdn.net/wiborgite/article/details/80599418