Sqoop-错误工具.ImportTool:导入失败:尝试从SQL Server导入时无法转换SQL类型2005

时间:2018-09-05 14:19:20

标签: sql-server hive sqoop parquet

我正在尝试使用Sqoop将表从SQL Server导入到Hive。下面是我正在使用的命令:

sqoop import --connect "jdbc:jtds:sqlserver://xxxxxxxxxx:1433;integratedSecurity=false;databaseName=xxxx;domain=xxxx" --username user -P --table notifications --split-by Id --hive-import --create-hive-table --hive-table testing.notifications --as-parquetfile --verbose

配置单元表不存在,其想法是使用我的sqoop命令创建它。但是,当我运行命令时,出现以下错误:

18/09/05 08:40:21 INFO manager.SqlManager: Executing SQL statement: SELECT t.* FROM [notifications] AS t WHERE 1=0
18/09/05 08:40:21 DEBUG manager.SqlManager: Found column Id of type [-5, 19, 0]
18/09/05 08:40:21 DEBUG manager.SqlManager: Found column Dt of type [93, 23, 3]
18/09/05 08:40:21 DEBUG manager.SqlManager: Found column path of type [12, 300, 0]
18/09/05 08:40:21 DEBUG manager.SqlManager: Found column type of type [12, 1000, 0]
18/09/05 08:40:21 DEBUG manager.SqlManager: Found column message of type [2005, 2147483647, 0]
18/09/05 08:40:21 DEBUG manager.SqlManager: Found column person of type [12, 100, 0]
18/09/05 08:40:21 DEBUG manager.SqlManager: Found column stage of type [12, 100, 0]
18/09/05 08:40:21 DEBUG manager.SqlManager: Found column lastModified of type [93, 23, 3]
18/09/05 08:40:21 DEBUG util.ClassLoaderStack: Restoring classloader: sun.misc.Launcher$AppClassLoader@64c64813
18/09/05 08:40:21 ERROR tool.ImportTool: Import failed: Cannot convert SQL type 2005

但是,当我从命令中删除--as-parquetfile参数时,它可以正常工作。使用--as-parquetfile有什么问题?

我需要将该表放在镶木地板中,并且尝试使用--query参数转换Dt中的lastModifiedtimestamp列(我想时间戳是[93, 23, 3]代表)的格式,如下所示:

--query "select Id, convert(varchar(25),Dt,120) as Dt, path, type, message, person, stage, convert(varchar(25),lastModified,120) as lastModified from dbo.notifications"

并且日志确认DtlastModified的数据类型已被修改:

18/09/05 09:30:12 INFO manager.SqlManager: Executing SQL statement: select Id, convert(varchar(25),Dt,120) as Dt, path, type, message, person, stage, convert(varchar(25),lastModified,120) as lastModified from dbo.notifications WHERE  (1 = 0)
18/09/05 09:30:12 DEBUG manager.SqlManager: Found column Id of type [-5, 19, 0]
18/09/05 09:30:12 DEBUG manager.SqlManager: Found column Dt of type [12, 25, 0]
18/09/05 09:30:12 DEBUG manager.SqlManager: Found column path of type [12, 300, 0]
18/09/05 09:30:12 DEBUG manager.SqlManager: Found column type of type [12, 1000, 0]
18/09/05 09:30:12 DEBUG manager.SqlManager: Found column message of type [2005, 2147483647, 0]
18/09/05 09:30:12 DEBUG manager.SqlManager: Found column person of type [12, 100, 0]
18/09/05 09:30:12 DEBUG manager.SqlManager: Found column stage of type [12, 100, 0]
18/09/05 09:30:12 DEBUG manager.SqlManager: Found column lastModified of type [12, 25, 0]

但是它仍然失败,并显示相同的错误。

我不确定是哪个列引起了错误。而且我不确定是否可以将--map-column-hive--as-parquetfile一起使用。

任何帮助将不胜感激。谢谢!

1 个答案:

答案 0 :(得分:0)

经过一些调试,我能够找出问题所在。我意识到错误消息:ERROR tool.ImportTool: Import failed: Cannot convert SQL type 2005具有导致问题的列的数据类型,即我的情况是2005,它对应于源表中的message列。 message列是带有varchar的{​​{1}},而max_length = -1varchar(max)

我将其转换为varchar(200),并解决了我的问题。

但是,我不确定为什么只有在sqoop命令中使用--as-parquetfile参数时才出现此问题。我希望听到有关此问题的更多讨论。

谢谢。