这导入了正确数量的记录,但我的Hive select命令给了我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表导入Hive表:
sqoop import
--connect jdbc:mysql://localhost/kmdb
--table widgets
-m 1
--hive-import
--hive-table widgets
我的架构看起来很好,如下所示:
蜂房>描述小部件;
好
id int
widget_name字符串
价格双倍
design_date string
版本int
design_comment string
所用时间: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 ','
这会有什么不同吗?
有什么想法吗?
答案 0 :(得分:2)
您在/user/hive/warehouse/widgets
位置的数据是如何格式化的?它是','分开吗?你是否已经在蜂巢中有桌面小部件?你在hive中已经有表检查表定义中的字段分隔符是什么(使用描述格式化的小部件)
由于sqoop导入将导入数据和元数据(如果hive表不存在)。看起来你已经有了一个带有字段分隔符的表而不是' ^ A'。这就是为什么当你使用sqoop导入数据时它会用' ^ A'加载数据。作为字段分隔符。
你有2个选项来纠正它。
1)删除表(drop table widgets),然后再次运行相同的sqoop命令,这将加载数据并使用默认字段分隔符^ A创建表。你会看到数据。
2)不要删除表并使用hive中的describe命令检查表的字段分隔符(我假设分隔符是,)。然后运行
sqoop import
--connect jdbc:mysql://localhost/kmdb
--table widgets
-m 1
--fields-terminated-by ','
--lines-terminated-by '/n'
--hive-import
--hive-overwrite
答案 1 :(得分:1)
我理解我在这里缺少的东西。我们需要在创建表时指定相同的分隔符。数据导入。
- 我创建了表格以使用字段分隔符',' - 我没有指定字段分隔符,因此Hive采用了默认分隔符。
在导入过程中添加以下参数后,它可以正常工作。
--fields-terminated-by ','
答案 2 :(得分:1)
当我们使用给定的import sqoop命令时,由self和data创建的配置单元表应转储到给定的目录位置,如下所示。
> 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
然后,当我们通过HIVE CLI获取数据时,就会遇到这个NULL问题。
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
那我该怎么办,很简单,我们只需在覆盖命令和问题解决中添加 --fields-terminated-by "\001"
。
答案 3 :(得分:0)
确保在sqooping之前在hive中创建了表,并且所有列的顺序和数据类型( HIVE TABLE )必须与源表匹配( MYSQL TABLE )。