• 如何在Data Lake Analytics中使用临时表


    前言

    Data Lake Analytics (后文简称DLA)是阿里云重磅推出的一款用于大数据分析的产品,可以对存储在OSS,OTS上的数据进行查询分析。相较于传统的数据分析产品,用户无需将数据重新加载至DLA,只需在DLA中创建一张与数据源关联的表,不仅简化了分析过程,还节约了存储成本,是做大数据分析的不二之选。

    当用户想通过DLA对OSS上的某个文件或者目录进行查询时,第一步需要先针对该文件或目录在DLA中创建一个table。当查询结束后,如果该table将不再使用,需要用户手动执行drop命令进行清理。

    在实际应用的某些场景中,有些table只在查询中使用一次即可,但每次使用都要手动建表删表。这时,用户可以选择使用DLA的临时表。该表的生命周期仅限于一条查询语句,当查询结束后,临时表将被自动删除。

    本文将以OSS数据源为例,重点介绍如何在查询语句中定义和使用临时表。

    临时表

    在DLA中,用户可以在查询SQL中嵌入建表语句(即,对临时表的定义),从而对嵌入的临时表进行查询。

    示例1:查询中只包含一个临时表,且建表语句相对简单。

    SELECT col1, col2 FROM
    TABLE temp_1
    (
      col1 int,
      col2 string
    )
    LOCATION 'oss://test-bucket-for-dla/tbl1_part/kv1.txt'
    
    -- 等效于 ->
    
    CREATE EXTERNAL TABLE temp_1
    (
      col1 int,
      col2 int
    )
    LOCATION 'oss://test-bucket-for-dla/tbl1_part/kv1.txt';
    
    SELECT col1, col2 FROM temp_1;
    
    

    示例2:查询中只含有一个临时表,建表语句中需要指定ROW FORMAT以及TBLPROPERITES。

    SELECT id, string_col FROM
    TABLE temp_2
    (
        id INT COMMENT 'default',
        string_col STRING COMMENT 'default'
    ) ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe' 
    STORED AS INPUTFORMAT 'org.apache.hadoop.mapred.TextInputFormat'
    OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
    LOCATION 'oss://test-bucket-for-dla/tbl1_part/kv1.txt'
    TBLPROPERTIES ('recursive.directories'='false');
    
    -- 等效于 ->
    
    CREATE EXTERNAL TABLE temp_2
    (
        id INT COMMENT 'default',
        string_col STRING COMMENT 'default'
    ) ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe' 
    STORED AS INPUTFORMAT 'org.apache.hadoop.mapred.TextInputFormat'
    OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
    LOCATION 'oss://test-bucket-for-dla/tbl1_part/kv1.txt'
    TBLPROPERTIES ('recursive.directories'='false');
    
    SELECT id, string_col from temp_2;
    
    

    示例3:建表语句中含有多个临时表

    SELECT temp_1.col1, temp_2.smallint_col
    FROM 
    TABLE temp_1
    (
      col1 int,
      col2 int
    )
    LOCATION 'oss://test-bucket-for-dla/tbl1_part/kv1.txt';
    
    JOIN
    
    TABLE temp_2
    (
        id INT COMMENT 'default',
        bool_col BOOLEAN COMMENT 'default',
        tinyint_col TINYINT COMMENT 'default',
        smallint_col SMALLINT COMMENT 'default',
        int_col INT COMMENT 'default',
        bigint_col BIGINT COMMENT 'default',
        float_col FLOAT COMMENT 'default',
        double_col DOUBLE COMMENT 'default',
        date_string_col STRING COMMENT 'default',
        string_col STRING COMMENT 'default',
        timestamp_col TIMESTAMP COMMENT 'default'
    )
    ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe' 
    WITH SERDEPROPERTIES ('field.delim'='|', 'serialization.format'='|') 
    STORED AS INPUTFORMAT 'org.apache.hadoop.mapred.TextInputFormat'
    OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
    LOCATION 'oss://test-bucket-for-dla/tbl2/tbl2.csv'
    TBLPROPERTIES ('recursive.directories'='false')
    
    ON temp_1.col1 = temp_2.id
    WHERE temp_2.bool_col = true;
    
    -- 等价于 ->
    
    CREATE EXTERNAL TABLE temp_1
    (
      col1 int,
      col2 int
    )
    LOCATION 'oss://test-bucket-for-dla/tbl1_part/kv1.txt';
    
    CREATE EXTERNAL TABLE temp_2
    (
        id INT COMMENT 'default',
        bool_col BOOLEAN COMMENT 'default',
        tinyint_col TINYINT COMMENT 'default',
        smallint_col SMALLINT COMMENT 'default',
        int_col INT COMMENT 'default',
        bigint_col BIGINT COMMENT 'default',
        float_col FLOAT COMMENT 'default',
        double_col DOUBLE COMMENT 'default',
        date_string_col STRING COMMENT 'default',
        string_col STRING COMMENT 'default',
        timestamp_col TIMESTAMP COMMENT 'default'
    )
    ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe' 
    WITH SERDEPROPERTIES ('field.delim'='|', 'serialization.format'='|') 
    STORED AS INPUTFORMAT 'org.apache.hadoop.mapred.TextInputFormat'
    OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
    LOCATION 'oss://test-bucket-for-dla/tbl2/tbl2.csv'
    TBLPROPERTIES ('recursive.directories'='false');
    
    SELECT temp_1.col1, temp_2.smallint_col
    FROM 
    temp_1
    JOIN
    temp_2
    ON temp_1.col1 = temp_2.id
    WHERE temp_2.bool_col = true;
    

    适用场景

    当OSS的目录下有数量较多的数据文件,这些文件的目录结构如下:

    oss://test-bucket-for-dla/mytable/data1.csv
    oss://test-bucket-for-dla/mytable/data2.csv
    ...
    oss://test-bucket-for-dla/mytable/dataN.csv
    
    1. 目录mytable下的所有文件有着相同的数据结构,即表结构相同
    2. 每次SQL查询只针对一个文件,即dataN.csv

    此时,用户可以考虑使用临时表进行查询,每次只需替换SQL中临时表的LOCATION路径值即可。

    注意事项

    1. 在一条查询语句中的多个临时表,其表名不能相同,需要在该查询语句中具有唯一性;
    2. 在执行查询前,需要先选定一个database,可以执行 use ;
    3. 临时表的路径需要是当前database所指目录下的子目录或者文件。

    更多文章



    本文作者:金络

    原文链接

    本文为云栖社区原创内容,未经允许不得转载。

  • 相关阅读:
    asp.net中session的原理及应用
    通过SessionID和用户名来保证同一个用户不能同时登录(单点登录)
    ASP.NET中application对象的用法
    Tornado Web 框架
    LinkCode 下一个排列、上一个排列
    python版本与编码的区别
    python基本数据类型——set
    python基本数据类型——int
    python基本数据类型——str
    python基本数据类型——list
  • 原文地址:https://www.cnblogs.com/zhaowei121/p/10622629.html
Copyright © 2020-2023  润新知