数据湖技术之iceberg(七)Spark管理iceberg表

南墨3年前技术文章2014

1.SparkSQL设置catalog配置

以下操作主要是SparkSQL操作Iceberg,同样Spark中支持两种Catalog的设置:hive和hadoop,Hive Catalog就是iceberg表存储使用Hive默认的数据路径,Hadoop Catalog需要指定Iceberg格式表存储路径。

在SparkSQL代码中通过以下方式来指定使用的Catalog:

val spark: SparkSession = SparkSession.builder().master("local").appName("SparkOperateIceberg")

  //指定hive catalog, catalog名称为hive_prod

  .config("spark.sql.catalog.hive_prod", "org.apache.iceberg.spark.SparkCatalog")

  .config("spark.sql.catalog.hive_prod.type", "hive")

  .config("spark.sql.catalog.hive_prod.uri", "thrift://node1:9083")

  .config("iceberg.engine.hive.enabled", "true")

 

  //指定hadoop catalog,catalog名称为hadoop_prod

  .config("spark.sql.catalog.hadoop_prod", "org.apache.iceberg.spark.SparkCatalog")

  .config("spark.sql.catalog.hadoop_prod.type", "hadoop")

  .config("spark.sql.catalog.hadoop_prod.warehouse", "hdfs://mycluster/sparkoperateiceberg")

  .getOrCreate()

2.使用Hive Catalog管理Iceberg表

使用Hive Catalog管理Iceberg表默认数据存储在Hive对应的Warehouse目录下,在Hive中会自动创建对应的Iceberg表,SparkSQL 相当于是Hive客户端,需要额外设置“iceberg.engine.hive.enabled”属性为true,否则在Hive对应的Iceberg格式表中查询不到数据。

1、创建表

//创建表 ,hive_pord:指定catalog名称。default:指定Hive中存在的库。test:创建的iceberg表名。

spark.sql(

      """

        | create table if not exists hive_prod.default.test(id int,name string,age int) using iceberg

      """.stripMargin)

注意:

1)创建表时,表名称为:${catalog名称}.${Hive中库名}.${创建的Iceberg格式表名}

2)表创建之后,可以在Hive中查询到对应的test表,创建的是Hive外表,在对应的Hive warehouse 目录下可以看到对应的数据目录。

1.png

2、插入数据

//插入数据

spark.sql(

  """

    |insert into hive_prod.default.test values (1,"zs",18),(2,"ls",19),(3,"ww",20)

  """.stripMargin)

3、查询数据

//查询数据

spark.sql(

  """

    |select * from hive_prod.default.test

  """.stripMargin).show()

结果如下:

2.png

在Hive对应的test表中也能查询到数据:

3.png

4、删除表

//删除表,删除表对应的数据不会被删除

spark.sql(

  """

    |drop table hive_prod.default.test

  """.stripMargin)

注意:删除表后,数据会被删除,但是表目录还是存在,如果彻底删除数据,需要把对应的表目录删除。

3.用Hadoop Catalog管理Iceberg表

使用Hadoop Catalog管理表,需要指定对应Iceberg存储数据的目录。

1、创建表

//创建表 ,hadoop_prod:指定Hadoop catalog名称。default:指定库名称。test:创建的iceberg表名。

spark.sql(

  """

    | create table if not exists hadoop_prod.default.test(id int,name string,age int) using iceberg

  """.stripMargin)

注意:

1)创建表名称为:${Hadoop Catalog名称}.${随意定义的库名}.${Iceberg格式表名}

2)创建表后,会在hadoop_prod名称对应的目录下创建该表

4.png

2、插入数据

//插入数据

spark.sql(

  """

    |insert into hadoop_prod.default.test values (1,"zs",18),(2,"ls",19),(3,"ww",20)

  """.stripMargin)

3、查询数据

spark.sql(

  """

    |select * from hadoop_prod.default.test

  """.stripMargin).show()

5.png

4、创建对应的Hive表映射数据

在Hive表中执行如下建表语句:

CREATE TABLE hdfs_iceberg  (

  id int,

  name string,

  age int

)

STORED BY 'org.apache.iceberg.mr.hive.HiveIcebergStorageHandler'

LOCATION 'hdfs://mycluster/sparkoperateiceberg/default/test'

TBLPROPERTIES ('iceberg.catalog'='location_based_table');

在Hive中查询“hdfs_iceberg”表数据如下:

6.png

5、删除表

spark.sql(

  """

    |drop table hadoop_prod.default.test

  """.stripMargin)

注意:删除iceberg表后,数据被删除,对应的库目录存在。


相关文章

K8S中 CNI 插件的解读

K8S中 CNI 插件的解读

一.CNI是什么首先我们介绍一下什么是 CNI,它的全称是 Container Network Interface,即容器网络的 API 接口。它是 K8s 中标准的一个调用网络实现的接口。Kubel...

helm简介

helm简介

一、Helm 是什么在没使用 helm 之前,向 kubernetes 部署应用,我们要依次部署 deployment、svc 等,步骤较繁琐。况且随着很多项目微服务化,复杂的应用在容器中部署以及管理...

使用 systemd 管理 MySQL 服务

前言systemd 是 Linux 系统推出的初始化(init)系统,MySQL 使用 RPM 或者 Debian 包安装 MySQL 会默认使用 systemd 来管理 MySQL 服务,不需要额外...

Redis 内存使用情况查看

内存情况查看1、MEMORY STATS--连接 redisredis-cli--执行 MEMORY STATS命令查询内存使用详情 MEMORY STATSRedis实例的内存开销主要由两部分组成:...

MySQL运维实战(4.7) SQL_MODE之ANSI_QUOTES

默认情况下,mysql使用反引号(`)作为标识符的引号。使用mysql关键字作为表名、字段名会报语法错误,这时可以加上反引号( `),避免报错。设置ANSI_QUOTES后,使用双引号(")...

pg_dump

逻辑备份    PG提供了pg_dump、pg_dumpall两种方式进行逻辑备份,其区别就是pg_dumpall只能将数据库全部数据集dump到一个脚本文件中,而pg_dump可以选择指定数据库进行...

发表评论    

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。