分区类型

    MaxCompute2.0对分区类型的支持进行了扩充,目前MaxCompute支持Tinyint、Smallint、Int、Bigint、Varchar和String分区类型。
    create table parttest (a bigint) partitioned by (pt bigint);
    insert into parttest partition(pt) select 1, 2 from dual;
    insert into parttest partition(pt) select 1, 10 from dual;
    select * from parttest where pt >= ‘2’;
    执行上述语句后,返回的结果只有一行,因为10被当作字符串和2比较,所以没能返回。

    分区使用限制
    —创建一个二级分区表,以日期为一级分区,地域为二级分区
    create table src (key string, value bigint) partitioned by (pt string,region string);
    查询时,Where条件过滤中使用分区列作为过滤条件。
    select from src where pt=’20170601’and region=’hangzhou’;
    —正确使用方式。MaxCompute在生成查询计划时只会将’20170601’分区下region为’hangzhou’二级分区的数据纳入输入中。select
    from src where pt = 20170601;
    — 错误的使用方式。在这样的使用方式下,MaxCompute并不能保障分区过滤机制的有效性。pt是String类型,当String类型与Bigint(20170601)比较时,MaxCompute会将二者转换为Double类型,此时有可能会有精度损失。
    分对分区操作的SQL的运行效率则较低,会给您带来较高的计费,例如输出到动态分区(DYNAMIC PARTITION)。
    对于部分MaxCompute的操作命令,处理分区表和非分区表时的语法有差别,详情请参见表操作和 INSERT操作。

    输出到动态分区(DYNAMIC PARTITION)
    动态分区语法
    insert overwrite table tablename partition (partcol1, partcol2 …) select_statement from from_statement;

    • select_statement字段中,后面的字段将提供目标表动态分区值。如目标表就一级动态分区,则select_statement最后一个字段值即为目标表的动态分区值。
    • 如果目标表有多级分区,在运行Insert语句时允许指定部分分区为静态,但是静态分区必须是高级分区。
    • 动态生成的分区值不允许为NULL,也不支持含特殊字符和中文,否则会引发异常。

    动态分区的示例如下:
    create table total_revenues (revenue bigint) partitioned by (region string);
    insert overwrite table total_revenues partition(region)
    select total_price as revenue, region
    from sale_detail;
    按照上述写法,在SQL运行之前,您无法得知会产生哪些分区。只有在select运行结束后,才能由region字段产生的值确定会产生哪些分区,这也是动态分区名字的由来。
    其他示例如下:
    create table sale_detail_dypart like sale_detail;—创建示例目标表。
    示例一:
    insert overwrite table sale_detail_dypart partition (sale_date, region)
    select shop_name,customer_id,total_price,sale_date,region from sale_detail;
    — 成功返回。
    动态分区示例

    在使用INSERT OVERWRITE语句插入到一张分区表时,您可以在分区中指定一个分区列名但不提供具体的值,并在SELECT子句中提供对应分区列的值。

    • 示例二:
      insert overwrite table sale_detail_dypart partition (sale_date=’2013’, region)
      select shop_name,customer_id,total_price,region from sale_detail;
      — 成功返回,多级分区,指定一级分区。
    • 示例三:
      insert overwrite table sale_detail_dypart partition (sale_date=’2013’, region)
      select shop_name,customer_id,total_price from sale_detail;
      — 失败返回,动态分区插入时,动态分区列必须在select列表中。
    • 示例四:
      insert overwrite table sales partition (region=’china’, sale_date)
      select shop_name,customer_id,total_price,region from sale_detail;
      — 失败返回,不能仅指定低级子分区,而动态插入高级分区。

    如果A或B为NULL,返回NULL,A为字符串,B为要匹配的模式, 如果匹配,返回TRUE,否则返回FALSE。(%)匹配任意多个字符,()匹配单个字符。要匹配(%)或()要用转义符表示(‘%’)或(‘’)。
    ‘aaa’ like‘a__’= TRUE
    ‘aaa’ like‘a%’ = TRUE
    ‘aaa’ like‘aab’= FALSE
    ‘a%b’ like‘a\%b’= TRUE
    ‘axb’ like ‘a\%b’= FALSE
    u_name中既有“三”又有“猫”的记录,请运用 and条件
    SELECT FROM [user] WHERE u_name LIKE ‘%三%’ AND u_name LIKE ‘%猫%’
    [ ]:表示括号内所列字符中的一个(类似正则表达式)
    SELECT
    FROM [user] WHERE u_name LIKE ‘[张李王]三’
    将找出“张三”、“李三”、“王三”(而不是“张李王三”);
    要匹配(%)或(
    )要用转义符表示(‘%’)或(‘_’)。
    A RLIKE B ==》 A是字符串,B是字符串常量正则表达式
    A<>B(A不等于B) 如果A或B为NULL,返回NULL;如果A不等于B,返回TRUE,否则返回FALSE。

    *在进行部分关系运算之前,您需要首先进行类型转换,否则可能返回null。如下举例,’2019-02-16 00:00:01’为DATETIME类型,而’2019-02-16’为STRING类型,在进行比较关系运算前需首先完成显示类型转换。
    select cast(‘2019-02-16 00:00:01’ AS string) > ‘2019-02-16’;
    select cast(‘2019-02-16 00:00:02’ AS datetime) > ‘2019-02-16 00:00:01’;
    由于DOUBLE值存在一定的精度差 相减 取绝对值 绝对值足够小时,认为两个DOUBLE数值相等
    ABS是MaxCompute提供的
    内建函数**,意为取绝对值
    abs(0.9999999999 - 1.0000000000) < 0.000000001
    — 0.9999999999和1.0000000000为10位精度,而0.000000001为9位精度。
    — 此时可以认为0.9999999999和1.0000000000相等。

    STRING和BIGINT做数值比较时,两边都会转换成DOUBLE类型,在比较过程中会有精度丢失。建议cast string as bigint再比较

    说明 如果A和B为BIGINT类型,返回结果为DOUBLE类型。*
    select age+10, age-10, age%10, -age, age
    age, age/10 from user;

    • STRING类型在参与运算前会进行隐式类型转换,转换为DOUBLE类型。
    • BIGINT和DOUBLE类型共同参与计算时,会将BIGINT隐式转换为DOUBLE再进行计算,返回结果为DOUBLE类型。
    • STRING和BIGINT做数值比较时,两边都会转换成DOUBLE类型,在比较过程中会有精度丢失。建议cast string as bigint再比较。