开发者学堂课程【大数据Impala教程:SQL语法--表数据导入方式】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/722/detail/12896
SQL语法--表数据导入方式
内容介绍:
一、 load data
二、insert into values
三、insert into select
impala 当中一个表的数据导入方式,整体概括起来有4种方式,结合了传统的数据库插入表的方式以及数据仓库特有的方式。
一、 load data
这种方式主要是已经有一个结构化标准的文件位于 hdf 之上,然后去创建一个表结构,表面跟数据正好对应上,使用load 的命令,把这个文件加载到这个表对应的路径下就可以映射成功,这一点跟 hive 非常的类似。
例如首先创建一个表叫做 user 里面有 id ,name 和 age 这三个字段,而且指定分割符之间是-t,也就是字表符。首先这个语句在这里做一个执行,打开 impala:
创建好这个表之后,这个表就会位于 hdf 一个路径下,选择/user/hive/warehouse/impala.db/user 路径,就是刚才创建这个表对应的路径,接下来把这个表对应的计划文件放在这个路径下,比方说现在准备一个文件,随便找下去,在这里做一个相关的编写,本地有一个 user.txt,这里面正好有两条记录,一个1号 Allen18岁,2号 Kobe19岁,而且分隔符是-t,接下来有两种方式你可以进行操作。
第一种方式直接将 Hadoop fs -put user.txt 上传到路径下如上图,上传完之后,这一个表下面就有了一个文件,来做一个查询,输入 select *from user 这个表,结果就映射出来了。叫做直 put 进去,官方更推荐的方式是把这个数据放在任何 hdf 路径下都没关系,用 load data 命令给它加载进去就好。这个路径可能没有部分权限的,表就加载不到。
例如创建一个路径,叫做 user 下的 impala,首先把这个数据上传到路径下,复制一下,如上图。这时候刷新,在user 下的 impala 下有一个 user1.txt,接下来把这个文件加载到 impala 表当中,用 load data 命令。执行后提示加载到一个文件到文件当中,加载之后,刷新,原来的文件就没有了,说明在它底层使用 load data 加载数据的时候,是做了一个数据的 MV 移动,而不是 CP 复制。移动到表对应的路径下,user1txt 过来。这两个文件它都可以检映成功,做一个 select*查询发现两个表都出来了,这就是第一种方式 load data。
二、insert into values
比较接近于传统的关系型数据库,在 hive 当中通常不建议,在 hive 当中执行插入,它底层会非常的慢,而在 impala当中你可以直接这么去做,因为它效率比较快。
如上图示例插入 insert 记录后 select 查询,张三的记录就出现。再做一个刷新,发现这里底层就多了一个文件,这个文件是一个下划线表达隐藏的文件,0大小没有任何意义。刚才这个文件当中,它速度非常快,如果把这个语句转到hive 当中去执行,很慢。这是传统关系型数据库当中非常实用多的手段,叫做 insert into values 就是说代插入的数据直接后面指定清楚。
三、insert into select
values 说插入表的数据来自于后面,values 指定,下面这个语法就可以解释说插入表的数据来自于后面 select 查询反馈的结果,例如创建一个表叫做 user-1.这个表当中正好只有两个字段,一个是 id int,另一个是 age int.这两个字段正好来自于刚才 user 表,再进行插入 insert into table. 去插入 user_1的时候就不再去指定 values 而指定后面的select from user 表。但是注意你插入这个表的时候,这个表它本身是有两个字段,而原来这个表单是有三个字段,所以在参数需要指定清楚字段名字,例如说 select ID 插入到第一列当中,然后再 select age 作为第二列查询到这个表当中。所以你要去保证查询返回的结果当中字段的类型、顺序个数和代插入表一致,如果不一致还会报错。执行完之后看一下,这样就完成了超语句,再去 select*from user_1,这里面就有刚才插入表的结果了,是只把 ID 和 age 拿过来,所以说你要自己控制顺序。
刚才你是先创建表,然后再去 inselect,现在可以一步到位,直接用 create as select,就是说去建表的时候,表当中有哪些字段类型顺序都不指定,包括数序都不指定,它的所有信息全部取决于后面的查询语句。例如做一个查询,创建表,create table user_2.这个表现在不写它里面有哪些字段类型,直接 as select id name from user.最后再来看一下,后面这个查询语句将会返回两个字段,一个 ID 和 name,返回几条记录。它原来什么类型,这也是什么类型,当然有几条数据也取决于你这后面查询反馈的结果,查询之后,再去 select*from 这个表后回车,这是在 impala 当中几种常见的数据导入方式,最终的目的就是一定要把数据放到对应的表的路径下就可以了,这样它才能解析映射成功。