Hive 从MySQL到配置单元的Sqoop导入成功,但select返回所有空值

Hive 从MySQL到配置单元的Sqoop导入成功,但select返回所有空值,hive,hdfs,sqoop,Hive,Hdfs,Sqoop,这已导入正确数量的记录,但我的配置单元选择命令给了我空数据值 hive> select * from widgets; OK NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL

这已导入正确数量的记录,但我的配置单元选择命令给了我空数据值

hive> select * from widgets;
OK
NULL    NULL    NULL    NULL    NULL    NULL
NULL    NULL    NULL    NULL    NULL    NULL
NULL    NULL    NULL    NULL    NULL    NULL
NULL    NULL    NULL    NULL    NULL    NULL
NULL    NULL    NULL    NULL    NULL    NULL
NULL    NULL    NULL    NULL    NULL    NULL
Time taken: 0.179 seconds, Fetched: 6 row(s)
我正在使用以下命令将数据从MySQL表导入配置单元表:

sqoop import 
--connect jdbc:mysql://localhost/kmdb 
--table widgets  
-m 1 
--hive-import
--hive-table widgets
我的模式如下所示: 蜂巢>描述小部件; 好啊 id int
小部件名称字符串
价格加倍
设计日期字符串
版本int
设计注释字符串
所用时间:0.268秒,获取:6行

我的数据如下所示:

$ hdfs dfs -cat /user/hive/warehouse/widgets/part-m-00000_copy_1
1sprocket0.252010-02-101Connects two gizmos
2gizmo4.002009-11-304null
3gadget99.991983-08-1313Our flagship product
(注意:我可以在控制台上看到字段分隔符特殊字符,但由于某些渲染,它们不会显示在这里。)

背景:该表实际上是使用另一个sqoop命令创建的:

$sqoop create-hive-table 
   --connect jdbc:mysql://localhost/kmdb 
   --table widgets 
   --fields-terminated-by ','
这会有什么不同吗


有什么想法吗?

您在位置
/user/hive/warehouse/widgets
中的数据是如何格式化的?是分开的吗?您在配置单元中已经有了表小部件吗?配置单元中已经有表了吗?检查表定义中的字段分隔符是什么(使用描述格式的小部件)

As sqoop导入将导入数据和元数据(如果配置单元表不存在)。看起来您已经有了一个字段分隔符不是“^a”的表。这就是为什么在使用sqoop导入数据时,它加载了以“^a”作为字段分隔符的数据

您有两个选项来更正它

1) 删除表格(删除表格小部件),然后再次运行相同的sqoop命令,这将加载数据并使用默认字段分隔符^A创建表格。您将看到数据

2) 不要删除表,并使用配置单元中的descripe命令检查表的字段分隔符是什么(我假设分隔符是,)。然后跑

sqoop import 
--connect jdbc:mysql://localhost/kmdb 
--table widgets  
-m 1 
--fields-terminated-by ','
--lines-terminated-by '/n'
--hive-import
--hive-overwrite

位置
/user/hive/warehouse/widgets
中的数据是如何格式化的?是分开的吗?您在配置单元中已经有了表小部件吗?配置单元中已经有表了吗?检查表定义中的字段分隔符是什么(使用描述格式的小部件)

As sqoop导入将导入数据和元数据(如果配置单元表不存在)。看起来您已经有了一个字段分隔符不是“^a”的表。这就是为什么在使用sqoop导入数据时,它加载了以“^a”作为字段分隔符的数据

您有两个选项来更正它

1) 删除表格(删除表格小部件),然后再次运行相同的sqoop命令,这将加载数据并使用默认字段分隔符^A创建表格。您将看到数据

2) 不要删除表,并使用配置单元中的descripe命令检查表的字段分隔符是什么(我假设分隔符是,)。然后跑

sqoop import 
--connect jdbc:mysql://localhost/kmdb 
--table widgets  
-m 1 
--fields-terminated-by ','
--lines-terminated-by '/n'
--hive-import
--hive-overwrite

我明白我在这里错过了什么。我们需要在表创建和数据导入期间指定相同的分隔符

-我创建表是为了使用字段分隔符“,” -我没有指定字段分隔符,所以配置单元使用默认分隔符

在导入过程中添加以下参数后,它工作正常

--fields-terminated-by ','

我明白我在这里错过了什么。我们需要在表创建和数据导入期间指定相同的分隔符

-我创建表是为了使用字段分隔符“,” -我没有指定字段分隔符,所以配置单元使用默认分隔符

在导入过程中添加以下参数后,它工作正常

--fields-terminated-by ','

确保在sqooping之前已在配置单元中创建了表,并且所有列(hive table)的顺序和数据类型必须与源表(MYSQL table)匹配

确保在sqooping之前已经在配置单元中创建了表,并且所有列(hive table)的顺序和数据类型必须与源表(MYSQL table)匹配

当我们使用给定的import sqoop命令时,self创建的配置单元表和数据应该转储到给定的目录位置,如下所示

> sqoop import --connect jdbc:mysql://xx.xx.xx.xx/tournament \
> --username "analytics" --password "xxxxxx" --table store_config \
> --target-dir maprfs:///user/hive/warehouse/tournament.db/store_config/  \
> --hive-import --create-hive-table --hive-table tournament.store_config
这个导入命令缺少什么

> --fields-terminated-by
默认情况下,它将分隔符作为选项卡,但如果要显式定义分隔符,则需要使用此命令

> --fields-terminated-by **char**
下一次我们要用

> sqoop import --connect jdbc:mysql://xx.xx.xx.xx/tournament
> --username "xxxxxx" --password "xxxxxx" \
> --table store_config \
> --delete-target-dir --target-dir 'maprfs:///user/hive/warehouse/tournament.db/store_config/' \
> --lines-terminated-by '\n' -m 1
然后,当我们通过配置单元CLI获取数据时,就会遇到这个空问题

hive> select * from store_config;
OK
NULL    NULL    NULL    NULL    NULL    NULL
NULL    NULL    NULL    NULL    NULL    NULL
NULL    NULL    NULL    NULL    NULL    NULL
NULL    NULL    NULL    NULL    NULL    NULL
NULL    NULL    NULL    NULL    NULL    NULL
NULL    NULL    NULL    NULL    NULL    NULL

那么我该怎么办呢?很简单,我们只需在覆盖命令中添加以“\001”结尾的字段即可解决问题。

当我们使用给定的import sqoop命令时,self创建的配置单元表和数据应转储到给定的目录位置,如下所示

> sqoop import --connect jdbc:mysql://xx.xx.xx.xx/tournament \
> --username "analytics" --password "xxxxxx" --table store_config \
> --target-dir maprfs:///user/hive/warehouse/tournament.db/store_config/  \
> --hive-import --create-hive-table --hive-table tournament.store_config
这个导入命令缺少什么

> --fields-terminated-by
默认情况下,它将分隔符作为选项卡,但如果要显式定义分隔符,则需要使用此命令

> --fields-terminated-by **char**
下一次我们要用

> sqoop import --connect jdbc:mysql://xx.xx.xx.xx/tournament
> --username "xxxxxx" --password "xxxxxx" \
> --table store_config \
> --delete-target-dir --target-dir 'maprfs:///user/hive/warehouse/tournament.db/store_config/' \
> --lines-terminated-by '\n' -m 1
然后,当我们通过配置单元CLI获取数据时,就会遇到这个空问题

hive> select * from store_config;
OK
NULL    NULL    NULL    NULL    NULL    NULL
NULL    NULL    NULL    NULL    NULL    NULL
NULL    NULL    NULL    NULL    NULL    NULL
NULL    NULL    NULL    NULL    NULL    NULL
NULL    NULL    NULL    NULL    NULL    NULL
NULL    NULL    NULL    NULL    NULL    NULL

那么我该怎么办呢?很简单,我们只需在overwrite命令中添加以“\001”结尾的字段,然后问题就解决了。

触发此命令之前是否存在表
小部件
,我使用另一个sqoop命令创建了该表:>sqoop创建配置单元表--connectjdbc:mysql://localhost/kmdb --table widgets——以“,”结尾的字段table
widgets
在触发此命令之前是否存在?是,我使用另一个sqoop命令创建了该表:>sqoop创建配置单元表--connectjdbc:mysql://localhost/kmdb --表小部件——以“,”结尾的字段Hi-Aditya,我看到的数据如下:[cloudera@quickstart ~]$hdfs dfs-cat/user/hive/warehouse/widgets/part-m-000001sprocket0.252010-02-101连接两个gizmo 2gizmo4.002009-11-304null 3gadget99.991983-08-1313我们的旗舰产品,但我的hive select查询输出都是null。该表是使用sqoop命令创建的。不知道这有什么不同。让我更新原始问题的更多细节:tablecreation&sche