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
报错找不到文件,但确定当前机器确实存在这个文件。
分析:
- 期初怀疑是权限或者用户不对,导致找不到文件。然后chmod、chown了一波,并没有卵用,问题不在这。
- 搜素解决了问题,分析为:hive导入数据语句 load data [local] inpath ,是一个服务器端的指令,它是在服务器端执行。因此指定local时表明加载的文件为本地文件,但是这里的local,在hive中指的是 hiveserver 服务所在的机器,而不是hivecli 或 beeline客户端所在的机器(生产环境大都是 hiveserver 和 hivecli不在同一个机器)。
方法:
- 把要加载的文件上传到 hiveserver所在的服务器(这一般是不可能的事情),然后执行 load data local inpath [path] [overwrite] into table table_name.
- 先将本地文件上传至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。
方法:
- 重新超出oracle数据,文本限定符为“无”,栏位分隔符为“定位”(文本中为^I)。
- 在hive中执行命令:show create table test_table_name; 可以看到建表脚本和行列分隔符等信息。
hive默认的分割方式,即行为\n,列为^A
- 修改数据文件的分隔符,替换为^A
-
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
- 在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。
而我导出的数据时间格式的日期格式符为“/”。
方法:
- 重新从oracle中导出数据,注意日期格式符修改为“-”。
- 重新load
经过一波操作终于可以导入数据进hive表中。