查询Delta表数据

在E-MapReduce中通过Spark创建的Delta表将自动同步到Hive元数据,您可以像使用其他表一样查询Delta表。您还可以通过使用Hive创建外表的方式来查询Delta表。本文为您介绍如何通过Spark创建表和Hive创建外表的方式,在Hive、Presto和Trino中查询Delta表的数据。

背景信息

  • Delta表的DDL和DML等操作只能在Spark中执行。您可以通过Hive、Presto和Trino引擎查询Delta表数据,详情请参见通过Spark创建表查询Delta表

  • E-MapReduce也支持对已经存在的Delta数据,通过创建Hive外表来查询数据,详情请参见创建Hive外表

使用限制

本文适用于EMR-3.37.0及后续版本,EMR-5.3.0及后续版本以及EMR-4.10.0版本。

通过Spark创建表查询Delta表

  1. 进入Spark命令行。
    1. 使用SSH方式登录到集群主节点,详情请参见登录集群
    2. 执行以下命令,进入Spark命令行。
      spark-sql
  2. 在Spark中创建并查询表数据。
    1. 执行以下命令,在Spark中创建Delta表。
      create table delta_table (id int) using delta location "/tmp/delta_table";
    2. 执行以下命令,向表中插入数据。
      insert into delta_table values 0,1,2,3,4;
    3. 执行以下命令,查看表数据。
      select * from delta_table;
      返回包含如下的信息。
      2
      3
      4
      0
      1
      Time taken: 1.847 seconds, Fetched 5 row(s)
  3. 查询Delta表数据。

    通过Hive查询Delta表数据

    重要
    • EMR 3.x系列的EMR-3.37.0及后续版本,需要添加参数,您可以在EMR控制台添加,也可以在运行命令时设置。控制台添加参数时,在Hive服务的配置页面的hive-site.xml中,如果使用的是Hive on MR,则添加参数名为hive.input.format,参数值为io.delta.hive.HiveInputFormat的配置项。如果使用的是Hive on Tez,则添加参数名为hive.tez.input.format,参数值为io.delta.hive.HiveInputFormat的配置项。添加操作请参见添加组件参数

    • 如果需要向Delta表中添加字段(使用ADD COLUMN),为了避免Hive查询数据异常的情况,建议将新增字段追加到分区字段之前。更多详细信息,请查看ALTER TABLE

    1. 执行以下命令,进入Hive命令行。

      hive
    2. 执行以下命令,在Hive中查看Delta表的数据。

      select * from delta_table;

      返回如下信息。

      2
      3
      4
      0
      1
      Time taken: 2.937 seconds, Fetched: 5 row(s)
      说明

      查看数据与在Spark中插入的数据一致,说明Hive已经成功访问了Delta表的数据。

    通过Presto查询Delta表数据

    1. 执行以下命令,进入Presto命令行。

      presto --server master-1-1:8889 --catalog delta --schema default --user hadoop

      命令中的参数说明如下:

      • --server master-1-1:8889:指定Presto服务器的地址和端口号。

      • --catalog delta:指定要连接的数据源的名称。

      • --schema default:指定要使用的数据库的名称。本文示例中,使用的是默认的数据库。您可以根据需要修改此参数。

      • --user hadoop:指定用于身份验证的用户名。

    2. 执行以下命令,在Presto中查看Delta表的数据。

      select * from delta_table;

      返回如下信息。

       id
      ----
        2
        3
        4
        0
        1
      (5 rows)
      说明

      查看数据与在Spark中插入的数据一致,说明Presto已经成功访问了Delta表的数据。

    通过Trino查询Delta表数据

    1. 执行以下命令,进入Trino命令行。

      trino --server master-1-1:9090 --catalog delta --schema default --user hadoop

      命令中的参数说明如下:

      • --server master-1-1:9090:指定Trino服务器的地址和端口号。

      • --catalog delta:指定要连接的数据源的名称。

      • --schema default:指定要使用的数据库的名称。本文示例中,使用的是默认的数据库。您可以根据需要修改此参数。

      • --user hadoop:指定用于身份验证的用户名。

    2. 执行以下命令,在Trino中查看Delta表的数据。

      select * from delta_table;

      返回如下信息。

       id
      ----
        2
        3
        4
        0
        1
      (5 rows)
      说明

      查看数据与在Spark中插入的数据一致,说明Trino已经成功访问了Delta表的数据。

创建Hive外表

E-MapReduce也支持对已存在的Delta数据创建Hive外表来查询。示例如下。

CREATE EXTERNAL TABLE delta_tbl (name string, age int, city string)
ROW FORMAT SERDE 'org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe'
WITH SERDEPROPERTIES("path" = "/path/to/delta")
STORED AS INPUTFORMAT 'io.delta.hive.DeltaInputFormat'
OUTPUTFORMAT 'io.delta.hive.DeltaOutputFormat'
LOCATION '/path/to/delta'
TBLPROPERTIES("spark.sql.sources.provider" = "delta");

如果您创建的集群是EMR 3.x系列的EMR-3.37.0及后续版本,您也可以通过Hive StorageHandler的方式创建外表。示例如下。

CREATE EXTERNAL TABLE delta_tbl123 (name string, age int, city string)
STORED BY 'io.delta.hive.DeltaStorageHandler'
WITH SERDEPROPERTIES("path" = "/path/to/delta")
LOCATION '/path/to/delta'
TBLPROPERTIES("spark.sql.sources.provider" = "delta");
说明

建表语句中SERDEPROPERTIES设置path,以及TBLPROPERTIES中设置spark.sql.sources.provider是为了兼容后续通过SparkSQL的方式查询。通过该方式创建Delta外表后,在Hive、Presto和Trino中查询表的方式,与通过Spark创建表访问查询Delta表方式相同,详情请参见步骤3