sqoop从rdbms表中将数据插入到错误的hive列​​中

时间:2016-02-04 06:41:43

标签: hadoop hive sqoop

我有一张名为'员工'在SQL Server中:

ID  NAME    ADDRESS   DESIGNATION
1   Jack     XXX       Clerk
2   John     YYY       Engineer

我在hive中创建了一个外部表(emp),并通过sqoop导入我使用sqoop的--query参数将数据从employee导入到hive表。如果我提到--query as' select * from employee'然后数据正确地插入到hive表中。但是如果我提到--query为' select ID,NAME,DESIGNATION'来自员工'那么'员工'的DESIGNATION栏中的数据table(rdbms)正被插入到' emp'的地址栏中。表而不是插入指定列。当我运行以下配置单元查询时:

select designation from emp;

我得到的价值是: 空值 空值 而不是:职员              工程师 但是,如果我将hive查询运行为:

select address from emp;

我得到的价值是: 书记 工程师 而不是:NULL             空值 修复这些不正确数据的任何想法都会有很大帮助。我目前正在使用0.11版本的配置单元,因此我无法使用0.14 hive版本提供的配置单元插入查询。

2 个答案:

答案 0 :(得分:0)

Sqoop语句将数据导入到hdfs目录中(假设字段分隔符为,)

1,Jack,Clerk
2,John,Engineer

因此,地址列将具有DESIGNATION数据,而DESIGNATION列将为空

您可以尝试 - 查询“从员工中选择ID,NAME,',DESIGNATION”,这应该可行

答案 1 :(得分:0)

好的,我给你看样品。

sqoop import --connect jdbc:mysql://host:port/db'?useUnicode=true&characterEncoding=utf-8' \
--username 'xxxx' \
--password 'xxxx' \
--table employee \
--columns 'ID,NAME,DESIGNATION' \
--where 'aaa=bbb' \
-m 1 \
--target-dir hdfs://nameservice1/dir \
--fields-terminated-by '\t' \
--hive-import \
--hive-overwrite \
--hive-drop-import-delims \
--null-non-string '\\N' \
--null-string '\\N' \
--hive-table 'hive_db.hive_tb' \
--hive-partition-key 'pt' \
--hive-partition-value '2016-01-20'

并且某些参数是可选的。

sqoop语法详细信息: http://sqoop.apache.org/docs/1.4.2/SqoopUserGuide.html#_literal_sqoop_import_literal