Scala s3中的数据分区
我们将关系数据库中的数据放在一个表中,列id和日期如下所示Scala s3中的数据分区,scala,apache-spark,amazon-s3,hive,emr,Scala,Apache Spark,Amazon S3,Hive,Emr,我们将关系数据库中的数据放在一个表中,列id和日期如下所示 productid date value1 value2 1 2005-10-26 24 27 1 2005-10-27 22 28 2 2005-10-26 12 18 尝试将它们作为拼花地板加载到s3,并在配置单元中创建元数据,以使用athena和redshift查询它们。我们最频繁的查询将过滤产品id、日期、月份和年份。因此,尝试以一种具有更好查
productid date value1 value2
1 2005-10-26 24 27
1 2005-10-27 22 28
2 2005-10-26 12 18
尝试将它们作为拼花地板加载到s3,并在配置单元中创建元数据,以使用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/
我们就这样分开了,
s3://mybucket/year=2017/month=06/day=01/
s3://mybucket/year=2017/month=06/day=02/
...
s3://mybucket/year=2017/month=08/day=31/
s3://bucket/year/month/year/day/hour/minute/product/region/availabilityzone/
s3://bucketname/2018/03/01/11/30/nest/e1/e1a
分钟四舍五入为30分钟。如果您的流量很高,您可以在几分钟内使用更高的分辨率,也可以减少一小时甚至一天
基于我们想要查询什么样的数据(使用雅典娜或红移光谱)以及查询的持续时间,它帮助了我们很多
希望有帮助。谢谢你的回答。你能帮我回答第三个问题吗?示例代码段会很有帮助。但是如果我不将year=放在路径中,我们将不得不像这里提到的那样手动添加分区-上次我检查时,Hive和相关工具需要
key=value
分区。我将删除带有=。我们每天都在使用GB的数据集,似乎不会影响速度。我们注意到多个分区的速度很慢。我们注意到多个分区的速度很慢——是的。如果您不需要显式地查询月或日,那么执行dt=20180301
,和hour=1130
将更有效。您通过什么进行查询?年,还是产品,还是两者的结合?您支持多少独特的产品?若它是一个很长的ID,那个么您应该使用ID前缀进行分区。根据我所读到的,配置单元的性能开始下降到10000个分区左右。365*12*7太多了,无法在其上构建API,这将允许使用年、月、日或产品id进行查询。而且它不是365*12*7,它是365*7,对吗?哦,是的。对不起,7*365。。。无论如何API其实并不重要。如果不优化更好的分区方案,Spark代码的速度会很慢是的,这就是为什么要找到更好的分区。此外,还有20000多种产品,如果我将产品和日期作为分区,这将使情况变得最糟糕。您可以在数据帧上partitionBy(“field1”、“field2”)
。。。然后使用.parquet(“s3://path”)
写入磁盘