hive的load踩过的坑

本文详细介绍了Hive中Load命令的使用方法,包括基本语法、常见问题及解决策略。解析了Load命令在处理不同数据源时的注意事项,如本地文件与HDFS文件的区别,以及数据类型不匹配导致的问题。并通过实例演示了如何正确配置数据文件的分隔符和日期格式,确保数据能够成功导入Hive表。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

load:

hive中load命令的使用语法

LOAD DATA [LOCAL] INPATH 'filepath' [OVERWRITE] INTO TABLE tablename [PARTITION (partcol1=val1, partcol2=val2 ...)]
 

'LOCAL'表示输入文件在本地文件系统上。如果'LOCAL'被省略,那么它会在HDFS中查找该文件。

关键字'覆盖'表示表中的现有数据被删除。如果忽略'OVERWRITE'关键字,则将数据文件附加到现有数据集。

注意:

  • 加载命令不执行对模式的数据验证。使用load data形式往hive表中装载数据时,不会检查字段类型,如果字段类型不一致,使用null值填充。如果字段过多则会丢弃,缺失则会使用null值填充。
  • 如果文件位于hdfs中,则将其移入Hive控制的文件系统名称空间。会将数据从HDFS文件/目录加载到表中。
  • 请注意,从HDFS加载数据将导致移动文件/目录,这里是文件的移动,不是复制。因此,该操作几乎是即时的。

坑1:

描述:

使用带'LOCAL'关键字的load命令,想从本地导入数据到hive表中,但是执行报错:No files matching path file

报错找不到文件,但确定当前机器确实存在这个文件。

分析:

  1. 期初怀疑是权限或者用户不对,导致找不到文件。然后chmod、chown了一波,并没有卵用,问题不在这。
  2. 搜素解决了问题,分析为:hive导入数据语句  load data [local] inpath ,是一个服务器端的指令,它是在服务器端执行。因此指定local时表明加载的文件为本地文件,但是这里的local,在hive中指的是 hiveserver 服务所在的机器,而不是hivecli 或 beeline客户端所在的机器(生产环境大都是 hiveserver 和 hivecli不在同一个机器)。

方法:

  1. 把要加载的文件上传到 hiveserver所在的服务器(这一般是不可能的事情),然后执行  load data local inpath [path] [overwrite] into table table_name.
  2. 先将本地文件上传至hdfs,然后使用 load data inpath [hdfspath] [overwrite] into table table_name。

推荐使用第二种方法

hadoop dfs -mkdir /input
hdfs dfs -ls /input  #刚建的文件夹下没有文件
hadoop fs -put  test.txt   /input
hdfs dfs -ls /input  #可以看到文件下有刚上传的文件
#在hive中执行load命令
oad data inpath [hdfspath] [overwrite] into table table_name

hdfs dfs -ls /input  #文件夹下的文件发生了移动

一个参考的好连接:https://blog.youkuaiyun.com/hao495430759/article/details/80529456 

坑2:

描述:

导入到hive中的表数据大量为NULL,只有第一个字段和分区字段有数据,其他字段全为NULL。

分析:

我在关系型数据库oracle导出的数据中每个数据字段的文本限定符为双引号(每个字段用双引号包围),栏位分隔符(字段分隔符)为逗号。但是hive中的表第一个数据字段为string,后面字段不为string。所以只是第一个字段类型一致,也只有它可以导入数据,其它字段类型不匹配,全部为NULL。

方法:

  1. 重新超出oracle数据,文本限定符为“无”,栏位分隔符为“定位”(文本中为^I)。
  2. 在hive中执行命令:show create table test_table_name; 可以看到建表脚本和行列分隔符等信息。hive默认的分割方式,即行为\n,列为^A
  3. 修改数据文件的分隔符,替换为^A
  4. cat -A test.txt #可以看到分隔符为^I
    set -i 's/   /^A/g' test.txt #test.txt原本的分隔符为^I(按“Ctrl+v,Ctrl+i”可以输出),^A(按“Ctrl+v,Ctrl+a”可以输出)
    cat -A test.txt #可以看到分隔符为^A
  5. 在hive中执行load命令。

一个很好的参考链接:https://blog.youkuaiyun.com/qq_26442553/article/details/80297028

坑3:

描述:

经过几次踩坑之后数据可以导入到hive中了,但是仔细一看hive表的timestamp类型的字段全部为NULL。

分析:

在Hive中提供了字段类型TIMESTAMP,但其对应的时间格式为yyyy-MM-dd HH:MM:SS,即通过LOAD命令将文本加载到已创建的表中时,只有满足上述格式的内容才可以被正确解析,否则只能识别为NULL。

而我导出的数据时间格式的日期格式符为“/”。

方法:

  1. 重新从oracle中导出数据,注意日期格式符修改为“-”。
  2. 重新load

经过一波操作终于可以导入数据进hive表中。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值