命令:
load data local inpath '/root/my_data/01_cookie.txt' into table test.t_cookie;
在linux系统hive中执行,把/root/my_data/01_cookie.txt文件加载到集群中hdfs的/user/hive/warehouse下test库t_cookie表,命令成功。
但是该语句放到datagrip上或者Hue上执行,显示“路径错误,找不到文件”
①首先排除路径问题
能在Linux系统下执行,则说明路径没有问题。
local关键字表示Hive在本地寻找文件(即Linux系统下)(拷贝文件),本地文件路径也可以指定完整的URI:
'file:///root/my_data/01_cookie.txt'
若从hdfs上导数据,完整URI为:(移动文件,非拷贝,)
'hdfs://namenode:端口号/root/my_data/01_cookie.txt'
如果没有Local关键字,Hive会根据完整的URI加载数据。
如果没有Local关键字,文件路径没有指定完整的URI,Hive默认从HDFS的目录下寻找文件(参数fs.default.name指定)
补充:如果对HiveServer2服务运行此命令。这里的本地文件系统指的是Hiveserver2服务所在机器的本地Linux文件系统,不是Hive客户端所在的本地文件系统。
②用户权限问题
linux系统上是root用户,在datagrip上也是用root用户连接Hive,按理来说,用户相同,权限也应该一样。但是该命令在datagrip和Hue上执行都显示找不到文件,后面给/root文件夹、/my_data文件夹和01_cookie.txt文件全部加上“777”的权限就可以了。
排查了一番,原来是其他用户组没有权限。显示找不到文件是因为:没有给其他用户组对/root文件夹添加可执行权限。于是:
chmod o+x /root
chomd o+x /root/my_data
chmod o+r /root/my_data/01_cookie.txt
上层文件夹添加可执行权限才能进入文件夹中查找文件,文件要添加可读权限才能被读。
但是,不建议给其他用户组增加对/root的权限。
那么问题来了,使用root用户通过datagrip连接的Hive,为什么会被分到其他用户组呢?
Hive的管理员用户在Cloudera Manager中叫做hive,而我们使用root用户连接,但实际操作还是hive用户在实现管理,hive用户是没有权限读取/root用户目录下得文件的。(root用户登录Linux系统是root用户有权限,root用户通过datagrip连接Hive实际是hive用户。)
建议做法:即使是root用户登录Linux系统,还是不要把文件放在/root目录下,其他用户组想要读取文件需要修改对/root目录的权限,不安全。最好把文件放到非/root目录下。