当前位置: 首页 > 知识库问答 >
问题:

从Spark中删除分区

束志业
2023-03-14
spark.sql(""ALTER TABLE backup DROP PARTITION (date < '20180910')"

从Spark中删除分区的替代方案是什么?有另一个实现来做到这一点?

谢了。

共有1个答案

卓雅达
2023-03-14

似乎暂时没有办法做到这一点。如SPARK-14922所示,此修补程序的目标版本是3.0.0,并且仍在进行中。

因此,在我看来,有两种可能的变通办法。

让我们使用Spark 2.4.3来设置这个问题:

// We create the table
spark.sql("CREATE TABLE IF NOT EXISTS potato (size INT) PARTITIONED BY (hour STRING)")

// Enable dynamic partitioning 
spark.conf.set("hive.exec.dynamic.partition.mode","nonstrict")

// Insert some dummy records
(1 to 9).map(i => spark.sql(s"INSERT INTO potato VALUES ($i, '2020-06-07T0$i')"))

// Verify inserts
spark.table("potato").count // 9 records
spark.sql("""ALTER TABLE potato DROP IF EXISTS PARTITION (hour='2020-06-07T01')""")
spark.table("potato").count // 8 records
spark.sql("""ALTER TABLE potato DROP IF EXISTS PARTITION (hour="2020-06-07T02", hour="2020-06-07T03")""")

org.apache.spark.sql.catalyst.parser.ParseException:
Found duplicate keys 'hour'.(line 1, pos 34)

== SQL ==
ALTER TABLE potato DROP IF EXISTS PARTITION (hour="2020-06-07T02", hour="2020-06-07T03")
----------------------------------^^^
spark.sql("""ALTER TABLE potato DROP IF EXISTS PARTITION (hour<="2020-06-07T03")""")

org.apache.spark.sql.catalyst.parser.ParseException:
mismatched input '<=' expecting {')', ','}(line 1, pos 49)

== SQL ==
ALTER TABLE potato DROP IF EXISTS PARTITION (hour<="2020-06-07T03")
-------------------------------------------------^^^
    null
// Get External Catalog
val catalog = spark.sharedState.externalCatalog

// Get the spec from the list of partitions 
val partitions = catalog.listPartitions("default", "potato").map(_.spec)

// Filter according to the condition you attempted.
val filteredPartitions = partitions.flatten.filter(_._2 <= "2020-06-07T03")
                                           .map(t => Map(t._1 -> t._2))

第2步:

我们将每个参数元组传递给一个单独的ALTER TABLE DROP PARTITION语句。

filteredPartitions.flatten.foreach(t => 
     spark.sql(s"""ALTER TABLE potato DROP IF EXISTS PARTITION (${t._1}="${t._2}")"""))
spark.table("potato").count // 6 records

或者将它们传递给目录的DropPartition函数。

// If you purge data, it gets deleted immediately and isn't moved to trash.
// This takes precedence over retainData, so even if you retainData but purge,
// your data is gone.
catalog.dropPartitions("default", "potato", filteredPartitions,
                       ignoreIfNotExists=true, purge=true, retainData=false)
spark.table("potato").count // 6 records
 类似资料:
  • 我从HDFS中获取数据,并将其存储在Spark RDD中。Spark根据HDFS块的数量创建分区的数量。这会导致大量的空分区,这些分区也会在管道过程中得到处理。为了消除这种开销,我想从RDD中过滤掉所有的空分区。我知道合并和重新分区,但不能保证所有空分区都会被删除。 还有别的办法吗?

  • 我有一个包含大量列的Spark数据框架。我想从中删除两列以获得新的数据帧。 如果列更少,我可以在API中使用select方法,如下所示: 但是既然从长列表中挑选列是一项乏味的任务,有解决方法吗?

  • ...等 但是,默认情况下,Spark会加载jar文件:/usr/lib/Spark/jars/guice-3.0.jar,其中包含com.google.inject.internal.injectorImpl,这个类也在我的超级jar中的Guice-4.x jar中。当我的服务启动时,这将导致。 我尝试在中设置一些Spark conf,将super jar放在类路径中,希望在Spark加载gui

  • 我从git和GitHub开始,我在GitHub上看了一个项目。我无意中点了一下叉子。现在它对我来说是一个新项目。 null 我想删除它。到目前为止,我只是在研究代码,并不真的需要叉子。

  • 我有一个外部配置单元表,其中有诸如year=2017,year=2018之类的分区,在它们内部,我还有year=2017和year=2018的每个月的分区。 如果是内部表,会发生什么情况?

  • 问题内容: 上面的代码将20分钟添加到StartTimeDate。有什么好方法可以删除那些20分钟未添加的内容?试图找到一种解决方案,但没有找到解决方案。有任何想法吗? 问题答案: 您没有任何特定的功能来减去任何日期部分 只需在前面添加负号 或乘以-1