sqoop从mysql导入到hive成功,但是select返回所有空值

gab6jxml  于 2021-06-03  发布在  Sqoop
关注(0)|答案(4)|浏览(528)

这已经导入了正确数量的记录,但是我的hiveselect命令给了我空数据值。

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

我的模式如下所示:hive>descripe小部件;确定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 ','

这有什么区别吗?
有什么想法吗?

30byixjq

30byixjq1#

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

u91tlkcl

u91tlkcl2#

您的数据在该位置的情况如何 /user/hive/warehouse/widgets 是否已格式化?是分开的吗?您的配置单元中已经有表小部件了吗?配置单元中已经有表了吗?检查表定义中的字段分隔符是什么(使用“描述格式”窗口小部件)
因为sqoop import将导入数据和元数据(如果配置单元表不存在)。看起来您已经有一个表的字段分隔符不是“^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
mcdcgff0

mcdcgff03#

当我们使用给定的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

当我们通过hivecli获取数据时,就会遇到这个空值问题。

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" 这在我们的改写命令和解决问题。

jyztefdp

jyztefdp4#

我明白我在这里错过了什么。我们需要在表创建和数据导入期间指定相同的分隔符。
-我创建表是为了使用字段分隔符','-我没有指定字段分隔符,所以配置单元使用默认分隔符。
在导入过程中添加以下参数后,它就工作了。

--fields-terminated-by ','

相关问题