开发者学堂课程【大数据Impala教程:SQL 语法--表特定语句--create、insert、desc】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/722/detail/12893
SQL 语法--表特定语句--create、insert、desc
内容介绍:
一、create table 语句
二、insert 语句
三、查询语句
一、create table 语句
1.概括
学习 impala 语法中跟表相关的特定语句。操作表相关的语句整体来看,跟 hive 的 SQL 语句类似。甚至在底层语法层面,包括指定分割符,指定路径,内部表等等,都跟 hive 一模一样,这点不用担心,直接把 hive 语法套过来使用。
2.创建表语句
语法以及当中有哪些重点需要注意的事项。第一个是 cerate table 创建表语句。在 impala 中创建的表分为两大块,第一块叫做内部表,默认路径会在 hive 的数仓下面,第二块可以指定路径,需要注意,当指定路径通过 location 创建时,要注意指定路径 impala 权限问题。指定一个路径在根目录下另外一个文件夹中。impala 默认以 impala 用户访问。如果没有权限,会有权限不足的问题,需要特别注意的。impala 中支持的数据类型和 hive 类似,除了标准的 SQL 类型,还支持 Java 类型。且大小写不敏感。在 impala 当下的版本中,已经支持了复合类型。想要知道当下 impala 支持是哪些类型。
3.操作
打开 impala shell 客户端,创建一个表 createtabletable t_test1(id int,hobby,arrarrry<string>)故意写错后回车,会报错类型不对。
下面做了一个提示,期望的类型有这些 array,bigint,Boolean,struct 等。这一块和 hive 非常类似。如果不加 if not exists 会报错,加了就不会。在默认情况下,创建的表位于的路径跟 hive 一模一样。在 user/hive/warehouse/my_db.db/student 下,以数据库名加上表名的形式存在。
二、insert 语句
1.概括
第二个语句叫 insert 语句,在 impala 当中用得比较多。在 hive 中很难去 insert 语句。执行一个 insert 中,底层会跑一个程序,这个效率是极其慢的。hive 中倡导使用命令加载、映射数据。但是 impala 底层不是执行语句,可以像关系型数据库那样,对大量的语句进行 insert 操作,整个 insert 语法有两个子句:into 和 overwrite。into 用于插入新纪录数据,overwrite 用于覆盖已有的记录。
2.演示
在 hive 中 show database,切换同一个数据库,同时使用 impala 数据库,创建一个表 create table,在 impala 中创立 create table t_test1(id int,name string)创建表后,如果有特殊需求,k也可以指定表中的分割符。在 insert into table t_test1 values(1,“zhangsan”);回车可以看见是3.93秒的操作,
接下来复制到 hive 中进行执行。改名为 test2 回车,
同样把 insert 语句放入 hive 中执行,效率会变慢。可以进入 hive 中看到程序在跑。说明在底层,hive 如果采用 insert 语法会非常慢。在 impala 中使用这种语法则会非常快。在进行操作时,有一个表后面的字段可以省去不写。前提是保证后面插入的确保值的顺序和表中列的顺序一致。
3.举个例子
(1)create into employee (id INT,name STRING, age INT,address STRING,salary BIGINT)
复制进行操作。创建一个表,叫做 employee,里面有(id INT,name STRING, age INT,address STRING,salary BIGINT)这些字段。创建好之后,截取插入记录类似于 insert into employee values(2,'Khilan',25,'Delhi',15000),再插入相似记录。select * from employee,速度非常快。
(2) 如果第三条记录插入,不再使用 insert into 插入,而是 insert overwrite,已知 overwrite 会覆盖已有记录。插入第三条记录后发现记录全部消失。因此,overwrite 要慎用。这样就完成了表的插入语句。也是 impala 中特有的插入表的方式。因为底层执行速度很快。
(3)默认情况下,创建的表插入语句都没有指定分割符。打开 node-1 ,来到 hive 的默认路径下,在 user/hive/warehouse/impala.db,employee 是 impala 插入表的数据。下载这里面的相关数据,打开文件发现数据中就是刚刚插入的表的数据。但是分割符不是所看见的。因此,impala 和 hive 的性质十分相似。文件名字不像 M 码的名字,侧面看出 impala 底层并不是 M 码程序。而 test2底层的文件就比较有规则。以上是没有指定分割符。如果想要有指定分割符,进行如下演示。创建一个表 create table t_test3(id int,name string)指定分割符 row format delimited fields terminated by “,”;这样就相当于指定分割符为逗号,如果是复合类型,也可以指定集合元素之间的换行符。再通过 insert into table 更改信息插入执行,用 select 查询,再验证。download 下来发现指定分割符不再是指定的符号。因此,跟 hive 在底层来看完全一致。只不过一个通过 M 码程序运行算出来,另一个通过 C++程序运行算出。
三、查询语句
1.select 语句
可以从表中进行字段的提取,如果是全表的字段,还可以指定列。
2.describe 语句
该语法可以帮助查看表的相关信息。
(1)举例
例如,刚入职一家公司,接手了 impala 数据库,打开之后看到有很多表。好奇表中有哪些字段,哪些信息,可快速用该语法查看信息。在 hive 中的 desc 是简写,针对表查询信息会非常清晰,属于哪个数据库,时间,路径,读取数据的分割符等都能查看。
(2)操作
将命令复制到 impala 进行回车发现,找不到 t_test2,说明在 hive 中创建的表默认不能更新。此时可以用 invalidate metadata 执行,再 show tables 就有了 test2 。将 hive 语法复制到 impala 执行回车,结果相同,说明 impala 跟hive 共用同一套元数据。当下脱离了 hive ,impala也完成不了。因此,除了使用本身的 describe,还能使用 desc formated,这样查看表的元数据信息会更加清晰。