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

获取Spark写入Hive metastore的所有新分区

刘升
2023-03-14

我有一个数据帧,我用它来插入到现有的分区配置单元表中,使用spark sql(使用动态分区)。一旦数据帧被写入,我想知道我的数据帧刚刚在蜂巢中创建的分区是什么。

我可以在数据帧中查询不同的分区,但这需要很长时间,因为它必须启动数据帧的整个进程。

我可以在写入配置单元之前持久化数据帧,这样,写操作和distinct partition_column操作就发生在缓存的数据帧之上。但我的数据帧非常大,不想花更多的时间来坚持。

我知道所有的分区信息都存储在Hive元存储中。Spark 中是否有任何元存储 API 可以帮助仅检索已创建的新分区?

共有2个答案

杜辉
2023-03-14
val epochTime = <epoch time before inserting the dataframe>
val partitionName = <Partition Column Name>
df.write.insertInto("<db_name>.<tbl_name>")
val catalogPartitions = spark.sharedState.externalCatalog.listPartitions("<db_name>", "<tbl_name>")
val partitionValues = catalogPartitions.filter(cp => ((cp.parameters.get("transient_lastDdlTime").isDefined && cp.parameters.getOrElse("transient_lastDdlTime", "0").toLong >= epochTime / 1000) || cp.lastAccessTime >= epochTime || cp.createTime >= epochTime) && cp.spec.contains(datePartition)).map(cp => cp.spec.getOrElse(datePartition, "")
      }).toList
processedPartitions = partitionValues.toList   

在大多数情况下,lastAccessTime作为0出现。createTime是创建分区的时间。但是在参数中,我发现了一个新参数transient_lastDdlTime,其中包含分区的更新时间戳。从更安全的角度来看,检查这三个分区,给我在给定纪元时间后创建或修改的分区。

谢麒
2023-03-14

您可以使用HiveMetastoreClient检索表的分区数据:

import org.apache.hadoop.hive.conf.HiveConf
import scala.collection.JavaConverters._
import org.apache.hadoop.hive.metastore.HiveMetaStoreClient

val hiveConf = new HiveConf(spark.sparkContext.hadoopConfiguration, classOf[HiveConf])
val cli = new HiveMetaStoreClient(hiveConf)

/* Get list of partition values prior to DF insert */
val existingPartitions = cli.listPartitions("<db_name>", "<tbl_name>", Short.MaxValue).asScala.map(_.getValues.asScala.mkString(","))
/* Insert DF contents to table */
df.write.insertInto("<db_name>.<tbl_name>")
/* Fetch list of partition values again, and diff with previous list */
val newPartitions = cli.listPartitions("<db_name>", "<tbl_name>", Short.MaxValue).asScala.map(_.getValues.asScala.mkString(","))
val deltaPartitions = newPartitions.diff(existingPartitions)
 类似资料:
  • 问题内容: 我正在尝试编写一个查询,以获取每个新闻的所有新闻和所有评论。我当前的查询是: 但是,当我以数组的形式获取查询时,它通过注释为我提供了一个键,而我希望通过新闻和一个子数组中的所有注释来获得一个键。 就像是: 谢谢! 问题答案: 您无法在一个查询中做到这一点-最好采用您已得到的查询并对所得到的答案进行后处理以获得所需的数据结构。 为了进一步详细说明-任何SQL查询只能返回二维数据数组-一维

  • 我有一个简单的Spring批处理作业,包含几个步骤,最后一步是编写报表,所以我有ItemReader、ItemProcessor和ItemWriter。ItemWriter按块编写取决于步骤中定义的块数,但我需要等到获得所有项后再编写最终报告。我怎么能那样做?

  • 但是我得到了这个错误: sparkException:由于阶段失败而中止作业:阶段0.0中的任务236失败4次,最近的失败:阶段0.0中丢失任务236.3(TID 287,server,executor 17):org.apache.hadoop.security.AccessControlException:权限被拒绝:user=user,access=read,inode=“/path-to-

  • 如何使用Amazon DynamoDB模块获取仅匹配分区键(表有排序键)的所有项目。我正在使用GetItemRequest查询没有排序键。 当我仅使用分区键和GetItemRequest进行查询时,我会遇到以下错误。 <代码>原因:软件。亚马逊。awssdk。服务。发电机B。模型DynamoDbException:提供的关键字元素与架构不匹配(服务:DynamoDb,状态代码:400,请求ID:6

  • 本文向大家介绍写一个获取页面中所有checkbox的方法相关面试题,主要包含被问及写一个获取页面中所有checkbox的方法时的应答技巧和注意事项,需要的朋友参考一下

  • 我有一个具有多个订阅和资源的Azure环境。我的要求是拥有这样一种功能:如果我传递用户名或SPN名称,它将为我提供所有azure资源(从管理组到azure资源),该用户/SPN可以访问这些资源,以及该资源的访问权限(读卡器/数据读卡器等)。 主要的问题是-我也想要PIM角色分配。有办法得到它吗? 探讨的选择 https://docs.microsoft.com/en-us/rest/api/aut