ALTER TABLE 分区操作-动态增加一级,多级分区,动态删除分区

这篇具有很好参考价值的文章主要介绍了ALTER TABLE 分区操作-动态增加一级,多级分区,动态删除分区。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1.8.5.6 ALTER TABLE 分区操作

alter 分区操作包括增加分区和删除分区操作,这种分区操作在Spark3.x之后被支持,spark2.4版本不支持,并且使用时,必须在spark配置中加入spark.sql.extensions属性,其值为:org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions,在添加分区时还支持分区转换,语法如下:

  • 添加分区语法:ALTER TABLE ... ADD PARTITION FIELD
  • 删除分区语法:ALTER TABLE ... DROP PARTITION FIELD

具体操作如下:

  1. 创建表mytbl,并插入数据
val spark: SparkSession = SparkSession.builder().master("local").appName("SparkOperateIceberg")
  //指定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")
  .config("spark.sql.extensions","org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions")
  .getOrCreate()

//1.创建普通表
spark.sql(
  """
    | create table hadoop_prod.default.mytbl(id int,name string,loc string,ts timestamp) using iceberg
  """.stripMargin)
//2.向表中插入数据,并查询
spark.sql(
  """
    |insert into hadoop_prod.default.mytbl values
    |(1,'zs',"beijing",cast(1608469830 as timestamp)),
    |(3,'ww',"shanghai",cast(1603096230 as timestamp))
  """.stripMargin)
spark.sql("select * from hadoop_prod.default.mytbl").show()

在HDFS中数据存储和结果如下:

alter分区表,spark,大数据,hadoop,分布式

alter分区表,spark,大数据,hadoop,分布式

  1. 将表loc列添加为分区列,并插入数据,查询
//3.将 loc 列添加成分区,必须添加 config("spark.sql.extensions", "org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions") 配置
spark.sql(
  """
    |alter table hadoop_prod.default.mytbl add partition field loc
  """.stripMargin)

//4.向表 mytbl中继续插入数据,之前数据没有分区,之后数据有分区
spark.sql(
  """
    |insert into hadoop_prod.default.mytbl values
    |(5,'tq',"hangzhou",cast(1608279630 as timestamp)),
    |(2,'ls',"shandong",cast(1634559630 as timestamp))
  """.stripMargin )
spark.sql("select * from hadoop_prod.default.mytbl").show()

在HDFS中数据存储和结果如下:

alter分区表,spark,大数据,hadoop,分布式

alter分区表,spark,大数据,hadoop,分布式

注意:添加分区字段是元数据操作,不会改变现有的表数据,新数据将使用新分区写入数据,现有数据将继续保留在原有的布局中

我的测试:

测试代码:

package com.shujia.spark.iceberg

import org.apache.spark.sql.SparkSession

object AlterTablePartition {
  def main(args: Array[String]): Unit = {

    /**
     * alter 分区操作包括增加分区和删除分区操作,这种分区操作在Spark3.x之后被支持,spark2.4版本不支持,并且使用时,
     * 必须在spark配置中加入spark.sql.extensions属性,
     * 其值为:org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions,在添加分区时还支持分区转换,语法如下:
     *     添加分区语法:ALTER TABLE ... ADD PARTITION FIELD
     *    删除分区语法:ALTER TABLE ... DROP PARTITION FIELD
     *
     */

    val spark: SparkSession = SparkSession
      .builder()
      .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://master:9083")
      .config("iceberg.engine.hive.enabled", "true")
      // 将 loc 列添加成分区,必须添加
      .config("spark.sql.extensions","org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions")
      .enableHiveSupport()
      .getOrCreate()


    //1.创建普通表
    spark.sql(
      """
        | create table if not exists hive_prod.iceberg.repartition1
        | (id int,name string,loc string,ts timestamp) using iceberg
        |
  """.stripMargin)
    //2.向表中插入数据,并查询
    spark.sql(
      """
        |insert into hive_prod.iceberg.repartition1 values
        |(1,'zs',"beijing",cast(1608469830 as timestamp)),
        |(3,'ww',"shanghai",cast(1603096230 as timestamp))
        |
      """.stripMargin)

    spark.sql("select * from hive_prod.iceberg.repartition1").show()


    //3.将 loc 列添加成分区,必须添加 config("spark.sql.extensions",
    // "org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions") 配置
    spark.sql(
      """
        |alter table hive_prod.iceberg.repartition1 add partition field loc
        |
  """.stripMargin)

    //4.向表 mytbl中继续插入数据,之前数据没有分区,之后数据有分区
    spark.sql(
      """
        |insert into hive_prod.iceberg.repartition1 values
        |(5,'tq',"hangzhou",cast(1608279630 as timestamp)),
        |(6,'xx',"hangzhou",cast(1608279631 as timestamp)),
        |(2,'ls',"shandong",cast(1634559632 as timestamp))
        |
      """.stripMargin )

    spark.sql("select * from hive_prod.iceberg.repartition1").show()

    //spark 提交任务的命令
    //spark-submit --master yarn --class com.shujia.spark.iceberg.AlterTablePartition spark-1.0.jar
  }
}

alter分区表,spark,大数据,hadoop,分布式

  1. 将ts列进行转换作为分区列,插入数据并查询
//5.将 ts 列通过分区转换添加为分区列
spark.sql(
  """
    |alter table hadoop_prod.default.mytbl add partition field years(ts)
  """.stripMargin)

//6.向表 mytbl中继续插入数据,之前数据没有分区,之后数据有分区
spark.sql(
  """
    |insert into hadoop_prod.default.mytbl values
    |(4,'ml',"beijing",cast(1639920630 as timestamp)),
    |(6,'gb',"tianjin",cast(1576843830 as timestamp))
  """.stripMargin )
spark.sql("select * from hadoop_prod.default.mytbl").show()

在HDFS中数据存储和结果如下:

alter分区表,spark,大数据,hadoop,分布式

alter分区表,spark,大数据,hadoop,分布式

我的测试,在一级分区的基础上再次添加分区

测试代码:

package com.shujia.spark.iceberg

import org.apache.spark.sql.SparkSession

object AlterTable2Partitions {
  def main(args: Array[String]): Unit = {

    val spark: SparkSession = SparkSession
      .builder()
      .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://master:9083")
      .config("iceberg.engine.hive.enabled", "true")
      // 将 loc 列添加成分区,必须添加
      .config("spark.sql.extensions","org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions")
      .enableHiveSupport()
      .getOrCreate()


    //5.将 ts 列通过分区转换添加为分区列
    spark.sql(
      """
        |alter table hive_prod.iceberg.repartition1 add partition field years(ts)
  """.stripMargin)

    //6.向表 mytbl中继续插入数据,之前数据没有分区,之后数据有分区
    spark.sql(
      """
        |insert into hive_prod.iceberg.repartition1 values
        |(4,'ml',"beijing",cast(1639920630 as timestamp)),
        |(4,'mm',"beijing",cast(1639920639 as timestamp)),
        |(6,'gb',"tianjin",cast(1576843830 as timestamp))
        |
      """.stripMargin )


    spark.sql("select * from hive_prod.iceberg.repartition1").show()

    //spark 提交任务的命令
    //spark-submit --master yarn --class com.shujia.spark.iceberg.AlterTable2Partitions spark-1.0.jar
  }
}

alter分区表,spark,大数据,hadoop,分布式

  1. 删除分区loc
//7.删除表 mytbl 中的loc分区
spark.sql(
  """
    |alter table hadoop_prod.default.mytbl drop partition field loc
  """.stripMargin)
//8.继续向表 mytbl 中插入数据,并查询
spark.sql(
  """
    |insert into hadoop_prod.default.mytbl values
    |(4,'ml',"beijing",cast(1639920630 as timestamp)),
    |(6,'gb',"tianjin",cast(1576843830 as timestamp))
  """.stripMargin )
spark.sql("select * from hadoop_prod.default.mytbl").show()

在HDFS中数据存储和结果如下:

alter分区表,spark,大数据,hadoop,分布式

注意:由于表中还有ts分区转换之后对应的分区,所以继续插入的数据loc分区为null

alter分区表,spark,大数据,hadoop,分布式

我的测试

测试代码:

package com.shujia.spark.iceberg

import org.apache.spark.sql.SparkSession

object DeleteTablePartition {
  def main(args: Array[String]): Unit = {

    /**
     *
     * 删除一个分区
     *
     */
    val spark: SparkSession = SparkSession
      .builder()
      .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://master:9083")
      .config("iceberg.engine.hive.enabled", "true")
      // 将 loc 列添加成分区,必须添加
      .config("spark.sql.extensions","org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions")
      .enableHiveSupport()
      .getOrCreate()

    //7.删除表 mytbl 中的loc分区
    spark.sql(
      """
        |alter table hive_prod.iceberg.repartition1 drop partition field loc
  """.stripMargin)
    //8.继续向表 mytbl 中插入数据,并查询
    spark.sql(
      """
        |insert into hive_prod.iceberg.repartition1 values
        |(4,'ml',"beijing",cast(1639920630 as timestamp)),
        |(6,'gb',"tianjin",cast(1576843830 as timestamp))
        |
  """.stripMargin )

    spark.sql("select * from hive_prod.iceberg.repartition1").show()
    //spark 提交任务的命令
    //spark-submit --master yarn --class com.shujia.spark.iceberg.DeleteTablePartition spark-1.0.jar
  }
}

alter分区表,spark,大数据,hadoop,分布式

  1. 删除分区years(ts)
//9.删除表 mytbl 中的years(ts) 分区
spark.sql(
  """
    |alter table hadoop_prod.default.mytbl drop partition field years(ts)
  """.stripMargin)
//10.继续向表 mytbl 中插入数据,并查询
spark.sql(
  """
    |insert into hadoop_prod.default.mytbl values
    |(5,'tq',"hangzhou",cast(1608279630 as timestamp)),
    |(2,'ls',"shandong",cast(1634559630 as timestamp))
  """.stripMargin )
spark.sql("select * from hadoop_prod.default.mytbl").show()

在HDFS中数据存储和结果如下:

alter分区表,spark,大数据,hadoop,分布式

alter分区表,spark,大数据,hadoop,分布式

我的测试:

测试代码:

package com.shujia.spark.iceberg

import org.apache.spark.sql.SparkSession

object DeleteTable2Partitions {
  def main(args: Array[String]): Unit = {

    /**
     *
     * 删除一个分区之后再次删除一个分区
     *
     */
    val spark: SparkSession = SparkSession
      .builder()
      .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://master:9083")
      .config("iceberg.engine.hive.enabled", "true")
      // 将 loc 列添加成分区,必须添加
      .config("spark.sql.extensions", "org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions")
      .enableHiveSupport()
      .getOrCreate()

    //9.删除表 mytbl 中的years(ts) 分区
    spark.sql(
      """
        |alter table hive_prod.iceberg.repartition1 drop partition field years(ts)
  """.stripMargin)
    //10.继续向表 mytbl 中插入数据,并查询
    spark.sql(
      """
        |insert into hive_prod.iceberg.repartition1 values
        |(5,'tq',"hangzhou",cast(1608279630 as timestamp)),
        |(2,'ls',"shandong",cast(1634559630 as timestamp))
  """.stripMargin )
    spark.sql("select * from hive_prod.iceberg.repartition1").show()


    //spark 提交任务的命令
    //spark-submit --master yarn --class com.shujia.spark.iceberg.DeleteTable2Partitions spark-1.0.jar
  }
  }

alter分区表,spark,大数据,hadoop,分布式文章来源地址https://www.toymoban.com/news/detail-574306.html

到了这里,关于ALTER TABLE 分区操作-动态增加一级,多级分区,动态删除分区的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Vue使用Element-table实现动态删除某行的操作(在删除后页面中不显示该行)

    点击删除按钮后,在数据库中删除该行并且在当前页面不刷新的情况下不显示该行 在点击删除后,将数据库中按照id删除该行以后,页面在不刷新的情况下还是显示着删除前的数据库中的数据。 可以将删除时传入该行row的index,再将展示的数据数组通过splice(index,1)方法截取。

    2024年02月15日
    浏览(33)
  • el-table动态生成多级表头的表格(js + ts)

    展示形式: 详细代码: (js) (ts)

    2024年02月10日
    浏览(30)
  • 实现 Table 的增加和删除,不依赖后端数据回显

    删除前 删除后 首先写一个 Table 我们可以对数组进行操作,首先是增加操作 删除指定元素

    2024年04月16日
    浏览(13)
  • Settings系列(三)根据需求动态添加删除一级菜单、二级菜单的设置项

    当时遇到定制需求,需要根据实际需要隐藏Settings的菜单项,于是开始了寻找方法 在看了一下源码,经过尝试后,确认生效后,就简单说明一下Settings中布局中主要组成元素 Settings中的菜单项是由 PreferenceScreen 和Preference组成的。其中PreferenceScreen 类似于我们平常使用布局中的

    2024年02月15日
    浏览(28)
  • hive建表语句 增加字段、分区基础操作

    目录 hive建表 内部分区表 外部分区表 表结构复制: hive表删除 hive表重命名 表修改操作 增加分区 修改分区 删除分区 新增表字段  IF NOT EXISTS : 表不存在才会创建  分隔符: field.delim是表的两个列字段之间的文件中的字段分隔符.                serialization.format是文件序列化

    2024年02月06日
    浏览(26)
  • Android10 Settings系列(三)根据需求动态添加删除一级菜单、二级菜单的设置项

    当时遇到定制需求,需要根据实际需要隐藏Settings的菜单项,于是开始了寻找方法 在看了一下源码,经过尝试后,确认生效后,就简单说明一下Settings中布局中主要组成元素 Settings中的菜单项是由 PreferenceScreen 和Preference组成的。其中PreferenceScreen 类似于我们平常使用布局中的

    2024年02月14日
    浏览(33)
  • el-table动态增加列、行数据,俩种方法实现按需选择

    表格数据过多的时候,需要实现动态选择数据的功能,有俩种方法可以按需选择,解决了表格动态选择时闪屏数据抖动问题。 注意,这个添加数据是tableData原本就有的,我做的这个操作类似就是折叠选择展示原有的数据 1.实现表格数据居中 2.动态添加内容 3.解决表格添加数据

    2024年02月06日
    浏览(26)
  • vue+element ui动态增加表单项并支持删除

    需求:点击加号动态添加表单项站点和通道,当站点和通道有多个时允许删除,只有一个时不能删除,删除按钮隐藏 先来看看效果吧 默认初始效果: 点击加号动态新增表单项后:  上代码: 其中,核心代码是表单项prop的写法,首先,先定义一个数组用来存放可动态添加的

    2024年02月09日
    浏览(27)
  • SQL ALTER TABLE 语句- 灵活修改表结构和数据类型

    SQL ALTER TABLE 语句用于在现有表中添加、删除或修改列,也可用于添加和删除各种约束。 要在表中添加列,请使用以下语法: 以下 SQL 向 \\\"Customers\\\" 表添加了一个 \\\"Email\\\" 列: 要在表中删除列,请使用以下语法(请注意,某些数据库系统不允许删除列): 以下 SQL 从 \\\"Customers\\\" 表

    2024年02月05日
    浏览(36)
  • 【MySQL系列】使用 ALTER TABLE 语句修改表结构的方法

    💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学习,不断总结,共同进步,活到老学到老 导航 檀越剑指大厂系列:全面总

    2024年04月10日
    浏览(31)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包