我有多个DataFrames (DFs)
,存储过去5年的每月客户数据。一些DFs
存储Revenue
信息,其他存储Complaints
数据等等。所有这些数据帧都是基于Customer ID
和Month
的,如下面的示例数据集所示-
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中。你知道吗
如有任何澄清,将不胜感激。你知道吗
目前没有回答
相关问题 更多 >
编程相关推荐