Hive Date Partitioned table - 在 S3 中使用混合日期流式传输数据
Hive Date Partitioned table - Streaming Data in S3 with mixed dates
我在使用 Hive Partitioned table 方面拥有丰富的经验。我使用 Hive 2.X。我正在面试大数据解决方案架构师角色,并被问到以下问题。
问题: 如何在按日期分区的 Hive table 中提取流数据?流式数据首先存储在 S3 存储桶中,然后加载到 Hive 中。尽管 S3 存储桶名称具有日期标识符,例如 S3_ingest_YYYYMMDD,但内容可能包含超过 1 个日期的数据。
我的回答: 由于内容可能有超过 1 个日期,因此创建外部 table 可能是不可能的,因为我们想要读取文件并分发文件基于日期。我建议我们首先在没有分区的外部暂存 table 中加载 S3 存储桶,然后使用动态分区设置 Load/Insert 最终日期分区 table,这会将数据动态分配到正确的分区目录。
面试官说我的答案不正确,我很好奇想知道正确答案是什么,但是运行没时间了。
我的回答中唯一需要注意的是,随着时间的推移,分区的日期目录将包含多个小文件,这可能会导致小文件问题,这始终可以通过批量维护过程来处理。
处理这种情况的 other/correct 选项是什么?
谢谢。
这取决于要求。
根据我的理解,如果一个文件或包含 S3_ingest_YYYYMMDD 个文件的文件夹可以包含多个日期,那么某些事件会在第二天甚至更晚加载。这是相当常见的情况。
摄取日期和事件日期是两个不同的日期。将摄取的文件放入按摄取日期 (LZ) 分区的 table。您可以跟踪初始数据。如果可以再加工,那就用ingestion_date作为LZ再加工的书签table。
然后安排一个过程,该过程将花费摄取日期的最后两天或更多天,并加载到由 event_date 分区的 table 中。最后一天总是不完整的,您可能需要将回溯期增加到 3 天或更多摄取天数(使用 ingestion_date >= current_date - 2 天过滤器),这取决于日期数反向摄取可能会加载事件日期。在此过程中,您使用 event_date 的动态分区并应用一些逻辑 - 清理等,然后加载到 ODS 或 DM 中。
此方法与您提出的非常相似。区别在于第一个 table,它应该被分区以允许您增量处理数据,并且如果您需要更改逻辑或上游数据也被重述并重新加载到 LZ 中,则可以轻松重述。
我在使用 Hive Partitioned table 方面拥有丰富的经验。我使用 Hive 2.X。我正在面试大数据解决方案架构师角色,并被问到以下问题。
问题: 如何在按日期分区的 Hive table 中提取流数据?流式数据首先存储在 S3 存储桶中,然后加载到 Hive 中。尽管 S3 存储桶名称具有日期标识符,例如 S3_ingest_YYYYMMDD,但内容可能包含超过 1 个日期的数据。
我的回答: 由于内容可能有超过 1 个日期,因此创建外部 table 可能是不可能的,因为我们想要读取文件并分发文件基于日期。我建议我们首先在没有分区的外部暂存 table 中加载 S3 存储桶,然后使用动态分区设置 Load/Insert 最终日期分区 table,这会将数据动态分配到正确的分区目录。
面试官说我的答案不正确,我很好奇想知道正确答案是什么,但是运行没时间了。
我的回答中唯一需要注意的是,随着时间的推移,分区的日期目录将包含多个小文件,这可能会导致小文件问题,这始终可以通过批量维护过程来处理。
处理这种情况的 other/correct 选项是什么?
谢谢。
这取决于要求。
根据我的理解,如果一个文件或包含 S3_ingest_YYYYMMDD 个文件的文件夹可以包含多个日期,那么某些事件会在第二天甚至更晚加载。这是相当常见的情况。
摄取日期和事件日期是两个不同的日期。将摄取的文件放入按摄取日期 (LZ) 分区的 table。您可以跟踪初始数据。如果可以再加工,那就用ingestion_date作为LZ再加工的书签table。
然后安排一个过程,该过程将花费摄取日期的最后两天或更多天,并加载到由 event_date 分区的 table 中。最后一天总是不完整的,您可能需要将回溯期增加到 3 天或更多摄取天数(使用 ingestion_date >= current_date - 2 天过滤器),这取决于日期数反向摄取可能会加载事件日期。在此过程中,您使用 event_date 的动态分区并应用一些逻辑 - 清理等,然后加载到 ODS 或 DM 中。
此方法与您提出的非常相似。区别在于第一个 table,它应该被分区以允许您增量处理数据,并且如果您需要更改逻辑或上游数据也被重述并重新加载到 LZ 中,则可以轻松重述。