上下文:根据胶水模式,我使用动态技术将来自lambda的数据流到一个S3桶中。然后,我在我的S3桶上运行一个爬虫来编目我的数据。我的数据,当写入运动消防软管时,有以下属性:'dataset_datetime,attr1,attr2,attr3,attr2 4.‘。我没有在从lambda编写的数据中,在我的运动消防软管中,也没有在我的胶水目录中定义任何分区。但是,当数据存储在我的S3桶中时,数据存储在以下dir结构中:
-year -month -day -hour -dataFile.parquet
然后,当我在上面运行我的爬虫时,我的爬虫会创建4个额外的分区键,这些键映射到年、月、日和小时。我不希望这些属性被创建..。
问:为什么胶水爬虫要创建这些附加属性,我如何阻止它创建它们?或者,如何防止动态在S3中创建上面的dir结构,而只是转储带有时间戳的文件?
发布于 2022-07-27 15:27:54
为什么Kinesis或Crawler要在我的数据中创建分区?
为了澄清,Kinesis在将数据写入S3时正在对其进行分区。默认行为是通过year、month、day和hour对数据进行分区。
为什么胶水爬虫要创建这些附加属性,我如何阻止它创建它们?
Glue Crawler基于正在爬行的数据的架构创建分区(或表)。如果包含路径中的文件的模式类似,那么爬虫将为每个子文件夹创建一个表,其中包含从包含路径到文件的每个子文件夹的分区。
示例:如果include path是s3://<bucket>/prefix/,而file1.parquet和file2.parquet有类似的模式,那么爬虫将创建一个包含4个分区列的表( 2022子文件夹1列,07子文件夹1列,等等)。
s3://<bucket>/prefix/2022/07/27/08/file1.parquet
s3://<bucket>/prefix/2022/07/27/09/file2.parquet不能直接阻止爬虫创建分区。您可以操作包含路径以深入子文件夹目录(例如,将包含路径设置为s3://<bucket>/prefix/2022/07/27/08),这将根据包含路径的深度阻止分区的创建。但是,这可能不是您想要做的,因为它将导致创建多个表。
参考资料:爬虫如何确定何时创建分区?(AWS)
或者,如何防止动态在S3中创建上面的dir结构,而只是转储带有时间戳的文件?
您可以通过动态分区实现您想要的结果。动态分区允许您覆盖默认的year/month/day/hour分区。如果您的模式有一些静态值字段,理论上可以将Firehose配置为基于该字段对数据进行分区,然后配置Glue Crawler include path以包含该分区子文件夹。
示例:将消防软管配置为基于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参考资料:动态数据防火墙(AWS)中的动态分区
建议:有几种不同的操作数据/分区的方法。我的建议是,不要违背火龙带和Glue Crawler的默认行为。相反,请考虑如何从此数据的客户端/使用者中抽象分区实现。例如,创建一个排除分区列的物化视图。
https://stackoverflow.com/questions/73128328
复制相似问题