设为首页 - 加入收藏 ASP站长网(Aspzz.Cn)- 科技、建站、经验、云计算、5G、大数据,站长网!
热搜: 创业者 数据 手机
当前位置: 首页 > 大数据 > 正文

[bigdata-010] 从其他数据库系统向Impala移植SQL

发布时间:2021-01-01 03:18 所属栏目:125 来源:网络整理
导读:本文档主要是CDH下列文档的翻译和摘要 https://www.cloudera.com/documentation/enterprise/5-7-x/topics/impala_porting.html 1. 由于数据类型、built-in函数、SQL方言以及Hadoop专有语法等原因,从其他数据库系统向Impala移植SQL需要考虑诸多修改和调优问

本文档主要是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
  • 根据数据容量,表结构,查询特性等,选择最佳文件格式
  • 优化分区命令,将一个表存储到文件尺寸合理的多个文件,而不是使用一个超大文件存储,但也不能存储到过多的极小文件。

(编辑:ASP站长网)

    网友评论
    推荐文章
      热点阅读