在将数据帧保存为拼花格式之前是否需要重新分区?

2024-09-28 17:26:54 发布

您现在位置:Python中文网/ 问答频道 /正文

我有多个DataFrames (DFs),存储过去5年的每月客户数据。一些DFs存储Revenue信息,其他存储Complaints数据等等。所有这些数据帧都是基于Customer IDMonth的,如下面的示例数据集所示-

df_revenue.show(100)
    +-----------+-----------+--------+-- ....--+-------+
    |Customer_ID|       City| Revenue|         |  Month|
    +-----------+-----------+--------+-- ....  +-------+
    |      60012|     Berlin|   24.64|         |JAN2017|
    |      60012|     Berlin|   33.00|         |FEB2017|
    |      60012|     Berlin|   44.76|         |MAR2017|
    ....
    ....
    ....
    |      58937|   Hannover|  101.32|         |JAN2016|
    |      58937|   Hannover|   66.72|         |APR2016|
    |      58937|   Hannover|  190.50|         |AUG2018|
    |      58937|   Hannover|   89.71|         |DEC2018|
    ....
    +-----------+-----------+--------+-- ....--+-------+

最终目标是在指定的12个月内加入这些数据帧。因此,对于JUN2018,我们将通过仅获取2017年7月-2018年6月(过去12个月)的数据来加入所有这些数据帧。你知道吗

所有这些数据帧都有完整的5年数据,每个月都以parquet格式存储,如下所示-

df_revenue.write.format('parquet').partitionBy('Month').save('/../revenue')

Month上使用^{}可以更快地从parquet文件中提取各个月份的数据,因为数据在parquet文件中是基于Month进行分区的。一旦这些包含12个月数据的子集数据帧被提取出来,我们就可以通过repartitioning首先在Customer_ID的基础上将它们连接起来,然后再将它们连接起来,这样就可以尽可能避免混乱(确实是一个代价高昂的操作)。像这样的-

df_revenue = spark.read.format('parquet')\
                       .load('/../revenue')\
                       .where((col('Month') >= lit('2017-07-01')) 
                                      & 
                             (col('Month') < lit('2018-06-30'))).\
                       .repartition(NumPartitions, 'Customer_ID')

df_complaints = .....
                       .repartition(NumPartitions, 'Customer_ID')
.
.
df_joined = df_revenue.join(df_complaints,['Customer ID'],how='left')

我的问题是:既然我们最终是在Customer ID的基础上加入这些子集数据帧,那么如果我们在将数据保存为拼花文件之前^{}将其保存为Customer ID会有任何帮助吗,如下图所示?你知道吗

df_revenue.repartition(n,'Customer_ID').write.format('parquet').partitionBy('Month').save('/../revenue')

我问这个问题的原因是因为我注意到,一旦我们从存储的parquet文件加载数据帧,number of partitions就会改变,如果它改变了,那么在将数据帧保存为parquet格式之前,repartitioning数据帧的用途是什么!我在so上看到过很多帖子,人们repartition()首先将数据帧存储在parquet中。你知道吗

如有任何澄清,将不胜感激。你知道吗


Tags: 文件数据idformatdf格式customerberlin