为什么Kinesis或Crawler在我的数据中创建分区



上下文:我使用kinesis根据粘合模式将数据从lambda流式传输到S3桶中。然后,我在S3存储桶上运行一个爬网程序来编目我的数据。当我的数据写入驱动器消防软管时,它具有以下属性:"dataset_datetime,attr1,attr2,attr3,attr4…"。无论是从lambda写入的数据,还是在驱动器防火软管中,还是在胶水目录中,我都没有定义任何分区。然而,当数据存储在我的S3存储桶中时,它存储在以下目录结构中:

-年-月-天-小时-数据文件.parquet

然后,当我运行我的爬网程序时,我的爬网器会创建4个额外的分区键,这些键映射到年、月、日和小时。我不想创建这些属性。。。

问题:为什么胶水爬行器会创建这些额外的属性,我如何阻止它创建这些属性?或者,我如何防止kinesis在S3中创建上面的目录结构,而只是用一些时间戳转储文件?

为什么Kinesis或Crawler在我的数据中创建分区?

为了澄清,Kinesis Firehose在将数据写入S3时对其进行了分区。默认行为是按yearmonthdayhour对数据进行分区。

为什么胶水爬行器会创建这些附加属性,我如何阻止它创建这些属性?

Glue爬网程序根据正在爬网的数据的架构创建分区(或表(。如果include路径中的文件的架构相似,则爬网程序将为文件的include路径中的每个子文件夹创建一个单独的表和分区。

示例:如果包含路径s3://<bucket>/prefix/,并且file1.parquetfile2.parquet具有相似的架构,则爬网程序将创建一个具有4个分区列的表(2022子文件夹为1列,07子文件夹为一列,依此类推(。

s3://<bucket>/prefix/2022/07/27/08/file1.parquet
s3://<bucket>/prefix/2022/07/27/09/file2.parquet

您不能直接阻止爬网程序创建分区。您可以操作include路径以深入子文件夹目录(例如,将include路径设置为s3://<bucket>/prefix/2022/07/27/08(,这将根据包含路径的深度来阻止创建分区。但是,这可能不是您想要做的,因为这将导致创建多个表。

参考:爬网程序如何确定何时创建分区?(AWS(

或者,我如何防止kinesis在S3中创建上述dir结构,而只是用一些时间戳转储文件?

您可以通过动态分区实现您想要的功能。动态分区允许您覆盖默认的year/month/day/hour分区。如果您的架构有一些静态值字段,理论上可以将Firehose配置为基于该字段对数据进行分区,然后将Glue Crawler包含路径配置为包含该分区子文件夹。

示例:Firehose配置为基于static_field模式动态划分数据(static_field始终具有相同的值(。如果Glue Crawler包含路径设置为s3://<bucket>/static_field=value/,则将创建一个仅包含架构中的列(没有分区(的表。

s3://<bucket>/static_field=value/file1.parquet
s3://<bucket>/static_field=value/file2.parquet

参考文献:Kinesis Data Firehose(AWS(中的动态分区

建议:有几种不同的方法可以操作数据/分区。我的建议是不要违背Firehose和Glue Crawler的默认行为。相反,考虑如何从这些数据的客户端/消费者中抽象分区实现。例如,创建一个不包括分区列的物化视图。

最新更新