【问题标题】:Data partitioning in s3s3 中的数据分区
【发布时间】:2018-08-30 00:00:11
【问题描述】:

我们将关系数据库中的数据放在单个表中,列 id 和 date 就是这样。

productid    date    value1 value2
1         2005-10-26  24    27
1         2005-10-27  22    28
2         2005-10-26  12    18

尝试将它们作为 parquet 加载到 s3 并在 hive 中创建元数据以使用 athena 和 redshift 查询它们。我们最常见的查询将过滤产品 id、日、月和年。因此尝试以一种具有更好查询性能的方式加载数据分区。

据我了解,我可以创建这样的分区

s3://my-bucket/my-dataset/dt=2017-07-01/   
...
s3://my-bucket/my-dataset/dt=2017-07-09/   
s3://my-bucket/my-dataset/dt=2017-07-10/

或者像这样,

s3://mybucket/year=2017/month=06/day=01/
s3://mybucket/year=2017/month=06/day=02/
...
s3://mybucket/year=2017/month=08/day=31/
  1. 在查询方面会更快,因为我有 7 年的数据。
  2. 另外,如何在此处为产品 ID 添加分区?这样它会更快。
  3. 如何使用 spark scala 创建这个 (s3://mybucket/year=2017/month=06/day=01/) 文件夹结构和 key=value。有什么例子吗?

【问题讨论】:

  • 通过查询什么?年,或产品,或两者兼而有之?您支持多少独特的产品?如果它是一个很长的 ID,那么您应该按 ID 的前缀进行分区。根据我的阅读,Hive 性能开始下降超过 10000 个分区。 365*12*7 太多了
  • 将在其上构建一个 API,允许使用年、月、日或产品 ID 进行查询。而且不是365*12*7,是365*7吧?
  • 哎呀,是的。对不起,7 * 365 ......无论如何。 API 并不重要。如果不优化更好的分区方案,Spark 代码会很慢
  • 是的,这就是为什么要为此寻找更好的分区。此外,有超过 20000 种产品,如果我将产品和日期作为分区,那将是最糟糕的。
  • 你可以在DataFrame上partitionBy("field1", "field2")...然后你使用.parquet("s3://path")写入磁盘

标签: scala apache-spark amazon-s3 hive emr


【解决方案1】:

我们是这样划分的,

s3://bucket/year/month/year/day/hour/minute/product/region/availabilityzone/

s3://bucketname/2018/03/01/11/30/nest/e1/e1a

分钟四舍五入为 30 分钟。如果您的流量很高,您可以在几分钟内获得更高的分辨率,也可以按小时甚至每天减少。

根据我们想要查询的数据(使用 Athena 或 Redshift Spectrum)以及持续多长时间,它有很大帮助。

希望对你有帮助。

【讨论】:

  • 感谢您的回答。你能帮我解决我的第三个问题吗?示例 sn-p 会有所帮助。
  • 但如果我不将 year= 放入路径中,我们将不得不手动添加分区,如此处所述 - forums.aws.amazon.com/thread.jspa?threadID=257650&tstart=0
  • Hive 和相关工具需要key=value 分区,我上次检查过
  • stackoverflow.com/questions/36927918/…。我将用 = 删除答案。我们每天都在使用 GB 中的数据集,并且似乎不会影响速度。我们注意到多个分区的速度很慢。
  • 我们注意到多个分区的速度很慢 -- 嗯,是的。如果您不需要明确地查询月份或日期,那么执行dt=20180301hour=1130 的性能要高得多。
猜你喜欢
  • 2019-02-24
  • 1970-01-01
  • 2021-05-02
  • 2018-01-29
  • 1970-01-01
  • 2019-06-10
  • 2021-03-02
  • 1970-01-01
  • 2020-04-25
相关资源
最近更新 更多