【发布时间】: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/
- 在查询方面会更快,因为我有 7 年的数据。
- 另外,如何在此处为产品 ID 添加分区?这样它会更快。
- 如何使用 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