全部產品
Search
文件中心

E-MapReduce:Hudi與Spark SQL整合

更新時間:Jul 01, 2024

E-MapReduce的Hudi 0.8.0版本支援Spark SQL對Hudi進行讀寫操作,可以極大的簡化Hudi的使用成本。本文為您介紹如何通過Spark SQL對Hudi進行讀寫操作。

使用限制

EMR-3.36.0及後續版本和EMR-5.2.0及後續版本,支援Spark SQL對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預設添加的輔助欄位的值。