本文档主要是CDH下列文档的翻译和摘要
https://www.cloudera.com/documentation/enterprise/5-7-x/topics/impala_porting.html
1. 由于数据类型、built-in函数、SQL方言以及Hadoop专有语法等原因,从其他数据库系统向Impala移植SQL需要考虑诸多修改和调优问题。
2. 移植DDL(数据定义语言)和DML(数据操作语言)
? ? 2.1 DDL包括 CREATE,ALTER,DROP,COMMENT,RENAME等。DML包括 SELECT,INSERT,UPDATE,DELETE,MERGE,CALL等。
? ? 2.2 要根据Impala schema和Hadoop文件格式的特性,重写schema,在这一块,Impala和传统数据库不兼容。
? ? 2.3 SQL Query,尽量使用传统数据库和Impala的最大公约数语法,以便让Query语句能同时在两者上运行。对于不能兼容的DDL问题,建议写成独立的Impala安装脚本,单独调试解决。
3. 数据类型的移植问题
- 用STRING替换VARCHAR,VARCHAR2,CHAR,且不要设置字段长度约束,比如VARCHAR(32)和VARCHAR(1)都替换成STRING。
- Impala支持UTF-8的存储和查询,有些函数只支持ASCII数据,所以需要对NCHAR,NVARCHAR,NCLOB做格式转化。
- Impala expect 只使用UTC时间,这是一种期望而不是强制。用TIMESTAMP替换DATE,DATETIME,TIME,且不要设置精度约束。
- 不要使用DECIMAL和NUMNER。如果精度要求高,可以使用FLAOT或者DOUBLE,对金融数据可以做拆分处理,比如,可以对数据拆分成美元和美分两个整数字段,如果数据特别巨大,也可以将数据用字符串存储,然后用UDF函数操作计算。
- Impala支持FLOAT,DOUBLE,REAL,不要设置任何精度约束,且REAL是DOUBLE的别名,所有REAL都是按照DOUBLE存储的。
- 如果关系库的整数类型是Imapa没有的,那就将它转成数值范围一致的Imapa整数类型。
- Impala的数都是SIGNED,没有UNSIGNED数。
- 对于bitwise位值,Impala用位数足够多的正整数存储。
- 对于BLOB数据:用STRING表示CLOB和TEXT类型,且大小不超过32k; 但对大二进制对象诸如BLOB,RAW BINARY,VARBINARY,Impala没有对应类型,因此不支持。
- Impala有BOOLEAN类型。
- Impala不支持嵌套类型和组合类型。
- 不要使用默认值约束,也就是DEFAULT,Impala有足够的柔性能处理各种输入。
- 不要在CREATE TABLE和ALTER TABLE使用PRIMARY KEY,FOREIGN KEY,UNIQUE,NOT NULL,UNSIGNED,CHECK约束。
- 不要在ALTER TABLE里使用CREATE INDEX,DROP INDEX,ALTER INDEX,INDEX,KEY。
- Impala只返回NULL,不抛出异常。
- Impala不支持的数据类型,推荐用STRING+UDFs统一解决。
-
检测数据文件里是否有不支持或者无法转换的数据,按照如下运行,可以快速发现错误,终止Query
set abort_on_error=true; select count(*) from (select * from t1);
4. 需要删除或者修改的SQL语句
- Impala没有DELETE。如果SQL出现了DELETE,删除它们。
- Impala没有UPDATE。
- Impala没有COMMIT和ROLLBACK。
- Impala在Query的时候,没有EXISTS和NOT EXISTS。
- Impala支持UNION和UNION ALL,但没有INTERSECT。
5. SQL构建的双重检查
- 某些SQL构建语句,或者机器生成SQL语句,可能会超出Impala的某些性能上限,因此需要双检。
- 没有STORED AS的CREATE TABLE,默认将数据存入纯文本文件。纯文本文件对于大容量和高性能查询而言不是好的选择。因此必要时需要修改。
- 没有PARTITIONED BY的CREATE TABLE,默认将全部数据存入一个文件,可能会导致这个文件数据容量过大,超出上限。
- INSERT... VALUES会导致HDFS每次创建一个很小的文件存储插入的数据,因此要慎用。
- 如果ETL没有做优化,可能会导致在HDFS上产生很多的小文件,最好用 INSERT...SELECT重新整理数据,创建新表。
- UNION ALL比UNION效率更高,建议优先使用。
6. 进一步的调优问题
- 每一次做JOIN Query或者INSERT...SELECT或者SELECT或者CREATE TABLE之后,使用COMPUT STATS
- 根据数据容量,表结构,查询特性等,选择最佳文件格式
- 优化分区命令,将一个表存储到文件尺寸合理的多个文件,而不是使用一个超大文件存储,但也不能存储到过多的极小文件。