【问题标题】:Convert folders structure to partitions on S3 using Spark使用 Spark 将文件夹结构转换为 S3 上的分区
【发布时间】:2019-07-31 09:33:16
【问题描述】:

我在 S3 上有很多数据,它们位于文件夹而不是分区中。结构如下:

## s3://bucket/countryname/year/weeknumber/a.csv

s3://Countries/Canada/2019/20/part-1.csv
s3://Countries/Canada/2019/20/part-2.csv
s3://Countries/Canada/2019/20/part-3.csv

s3://Countries/Canada/2019/21/part-1.csv
s3://Countries/Canada/2019/21/part-2.csv

有没有办法将该数据转换为分区。像这样的:

s3://Countries/Country=Canada/Year=2019/Week=20/part-1.csv
s3://Countries/Country=Canada/Year=2019/Week=20/part-2.csv
s3://Countries/Country=Canada/Year=2019/Week=20/part-3.csv

s3://Countries/Country=Canada/Year=2019/Week=21/part-1.csv
s3://Countries/Country=Canada/Year=2019/Week=21/part-2.csv

我不知道如何做到这一点,而不是使用 for 循环遍历所有文件夹并加载数据,这很复杂。

我们将不胜感激。

【问题讨论】:

  • 我的数据没有分区。
  • 您的数据是手动按周数分区的,您只需将其设置为分区即可。
  • 我该怎么做?
  • 通过在 Country 上运行爬虫,它将创建分区 partition_0、partition_1、partition_2。您可以通过 Glue 控制台或通过胶水 pyspark 代码重命名它们。

标签: bash apache-spark amazon-s3 amazon-athena


【解决方案1】:

Hive 样式路径并不总是用于分区。我从您在 Athena 的上下文中编写的另一个问题中得到了这个问题,所以我猜测底层的元存储实际上是 Glue,并且您确实针对的是 Athena(我将 amazon-athena 标签添加到您的问题)。

在 Presto 或 Athena/Glue 中,您可以为任何类型的路径添加分区,只要前缀不重叠​​。例如,您要在第一个示例中添加分区,您可以这样做:

ALTER TABLE table_name ADD IF NOT EXISTS
  PARTITION (country = 'Canada', year_week = '2019-20') LOCATION 's3://Countries/Canada/2019/20/'
  PARTITION (country = 'Canada', year_week = '2019-21') LOCATION 's3://Countries/Canada/2019/21/'

这假设有一个 year_week 列,但如果你愿意,你可以将 yearweek 作为单独的列(并使用 (country = 'Canada', year = '2019', week = '20')),两者都可以。


为什么几乎所有 Athena 示例都使用 Hive 样式路径(例如 country=Canada/year=2019/week=20/part-1.csv)?部分原因是由于历史原因,IIRC Hive 不支持任何其他方案,分区和路径是紧密耦合的。另一个原因是 Athena/Presto 命令MSCK REPAIR TABLE 仅适用于这种分区方式(但您想要avoid relying on that command anyway)。还有其他工具假设或使用这种风格而不是其他工具。如果你不使用这些,那没关系。


如果您绝对必须使用 Hive 样式分区,则有一个功能可以让您创建“符号链接”到单独路径结构中的文件。您可以在此处找到有关如何执行此操作的说明:https://stackoverflow.com/a/55069330/1109 - 但请记住,这意味着您必须使其他路径结构保持最新。如果您不必为分区使用 Hive 样式路径,我建议您不要为增加的复杂性而烦恼。

【讨论】:

  • 再次感谢您回答这个问题。只是简单的问题,为所有国家和月份和日期生成该查询不是很复杂吗?我想我需要使用 boto 或其他一些库来读取密钥并使用它生成查询。我说的对吗?
  • 我通常会编写一个脚本来扫描 S3(或使用 S3 Inventory 获取列表)并生成 ALTER TABLE SQL。您可以使用list_objects_v2DelimiterPrefix 选项递归地列出结构,但避免列出每个对象(这实际上是Athena 在查询未分区表时所做的)。
  • 太棒了!谢谢你的提示。如果没有问题,我会尝试。我会接受的:)
猜你喜欢
  • 1970-01-01
  • 2021-12-11
  • 2014-07-11
  • 2021-07-15
  • 2010-10-31
  • 1970-01-01
  • 1970-01-01
  • 2020-04-19
  • 1970-01-01
相关资源
最近更新 更多