gpt4 book ai didi

apache-spark - 外部 Hive 表刷新表与 MSCK 修复

转载 作者:行者123 更新时间:2023-12-04 05:17:28 25 4
gpt4 key购买 nike

我将外部配置单元表存储为 Parquet,按列分区,例如 as_of_dt并通过 Spark 流插入数据。
现在每天都会添加新分区。我在做msck repair table以便 hive Metastore 获取新添加的分区信息。这是唯一的方法还是有更好的方法?我担心如果下游用户查询表,会msck repair导致数据不可用或陈旧数据的任何问题?我正在通过 HiveContext API 并查看 refreshTable选项。知道使用 refreshTable 是否有意义反而 ?

最佳答案

要直接回答您的问题 msck repair table,将检查表的分区是否处于事件状态。这意味着如果您删除了一些分区,并且不希望它们显示在表的 show partitions 命令中,则 msck repair table 应该删除它们。 Msck 修复可能比 invalidate 或 refresh 语句花费更多的时间,但是 Invalidate Metadata 仅在 Hive 中运行,仅更新 Hive Metastore。刷新仅在 Spark SQL 中运行并更新 Spark 元数据存储。

如果您在处理中的某处完成添加分区步骤,Hive Metastore 应该没问题,但是如果您想通过 Spark SQL 访问 Hive 表,您将需要通过 Spark(或 Impala 或其他更新 Spark 的进程)更新元数据元数据)。

任何时候更新或更改 hive 表的内容时,Spark 元存储都可能不同步,导致您无法通过 spark.sql 命令集查询数据。这意味着如果你想查询你需要保持 Spark Metastore 同步的数据。

如果你有一个允许它的 Spark 版本,你应该刷新并向 Spark 中的 Hive 表添加分区,这样所有的元存储都是同步的。以下是我的做法:

//Non-Partitioned Table
outputDF.write.format("parquet").mode("overwrite").load(fileLocation)
spark.sql("refresh table " + tableName)

//Partitioned Table
outputDF.write.format("parquet").mode("overwrite").load(fileLocation + "/" + partition)
val addPartitionsStatement = "alter table" + tableName = " add if not exists partition(partitionKey='" + partition + "') location '" + fileLocation + "/" + partition + "'"
spark.sql(addPartitionsStatement)
spark.sql("refresh table " + tableName)

关于apache-spark - 外部 Hive 表刷新表与 MSCK 修复,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51712996/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com