Hive访问Delta Lake和Hudi数据

Hive不支持写入数据到Delta Lake和Hudi,但是可以通过外部表的方式查询Delta Lake和Hudi中的数据。本文通过示例为您介绍如何使用EMR上的Hive访问Delta Lake和Hudi数据。

前提条件

  • 已创建包含Hive、Delta Lake和Hudi服务的集群,详情请参见创建集群

  • 已登录集群,详情请参见登录集群

使用限制

EMR-3.36.0及后续版本和EMR-5.2.0及后续版本,支持Hive对Hudi进行读操作。

Hive访问Delta Lake数据

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

    spark-sql
  2. 在Spark中创建并查询表数据。

    1. 执行以下命令,在Spark中创建Delta表。

      create table delta_table (id int) using delta;
    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. 在Hive中查看Delta Lake数据。

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

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

      desc formatted delta_table;
    3. 执行以下命令,在Hive中查看Delta Lake表的数据。

      select * from delta_table;

      返回如下信息。

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

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

Hive访问Hudi数据

重要 EMR-3.36.0及后续版本和EMR-5.2.0及后续版本,支持Hive对Hudi进行读操作。

Spark读写Hudi

  • 启动方式

    • Spark2和Spark3 hudi0.11以下版本

      spark-sql \
      --conf 'spark.serializer=org.apache.spark.serializer.KryoSerializer' \
      --conf 'spark.sql.extensions=org.apache.spark.sql.hudi.HoodieSparkSessionExtension'
    • Spark3 hudi0.11及以上版本

      spark-sql \
      --conf 'spark.serializer=org.apache.spark.serializer.KryoSerializer' \
      --conf 'spark.sql.extensions=org.apache.spark.sql.hudi.HoodieSparkSessionExtension' \
      --conf 'spark.sql.catalog.spark_catalog=org.apache.spark.sql.hudi.catalog.HoodieCatalog'
  • 使用示例

    • 建表

      create table h0 (
        id bigint,
        name string,
        price double,
        ts long
      ) using hudi
      tblproperties (
        primaryKey="id",
        preCombineField="ts"
      );
    • 查看表详情

      desc formatted h0;

      返回信息如下所示。

      _hoodie_commit_time     string
      _hoodie_commit_seqno    string
      _hoodie_record_key      string
      _hoodie_partition_path    string
      _hoodie_file_name       string
      id                      bigint
      name                    string
      price                   double
      ts                      bigint
      说明

      _hoodie_commit_time_hoodie_commit_seqno_hoodie_record_key_hoodie_partition_path_hoodie_file_name为Hudi默认添加的辅助字段。

    • 数据操作

      -- insert
      insert into h0 values (1, 'a1', 10, 1000), (2, 'a2', 11, 1000);
      
      -- update
      update h0 set name = 'a1_new' where id = 1;
      
      -- delete
      delete from h0 where id = 1;
    • 查询

      • 示例1

        select id, name, price, ts from h0;

        查询结果如下所示。

        2    a2    11.0    1000
      • 示例2

        select * from h0;

        查询结果如下所示。

        4.820221130150621338    20221130150621338_0_1    id:2        40d6507e-0579-42ce-a10f-c5e07a3981e5-0_0-29-2007_2022113015062****.parquet    2    a2    11.0    1000
        说明

        由于当前为非分区表,所以_hoodie_partition_path为空。前四个字段为Hudi默认添加的辅助字段的值。

    更多Spark读写Hudi示例,请参见Spark Guide

Hive查询Hudi

说明

Hudi仅支持Spark或者Flink建表和写入数据,Hive仅支持查询。

直接输入hive命令进入Hive CLI命令行或者通过Beeline连接Hive ThriftServer,然后执行SQL语句即可。示例如下。

-- select
select * from h0;