EDIT1:
我从csv文件中读取数据,这些文件存储在以下位置:" rawdata / date = 2018-05-20 / id = 32875636 / 0.csv",过滤它(期望过滤器为下推到源代码并对其进行多次转换。
在rawdata /文件夹中有几个具有不同日期的文件夹。但是对于我的分析,我只过滤了一个选定日期的数据。如果我在过滤后使用persist()/ cache(),那么一切都很好。但如果没有,那么在某些时候我可以看到所有日期都被阅读。
from datetime import date
data = spark_session.read.csv("rawdata", header='true', inferSchema='true')
df = data.filter(data.Date == date(2018, 3, 18))
# df.persist()
df作为AnalyticsClass的参数传递:
class AnalyticsClass():
def __init__(self, spark_session, params, df):
self.df = df
self.param1 = params.get(param1)
self.partition_cols = ['Date', 'id']
...
@staticmethod
def prefilter(df):
return df.withColumnRenamed('col_name', 'another_col_name')
def execute_and_save(self):
df = self.prefilter(self.df)
output = self.execute(df)
...
def execute(self, df):
aggregated_data = df.groupBy(self.partition_cols)
max_col1 = aggregated_data.agg(max('col1').cast(DecimalType(6, 2)).alias('max_col1'))
avg_col1 = aggregated_data.agg(avg('col1').cast(DecimalType(6, 2)).alias('avg_col1'))
data_frames = [max_col1, avg_col1]
basic_analytics = data_frames[0]
max_col1.select('Date').show()
avg_col1.select('Date').show()
for analitycs in data_frames[1:]:
basic_analytics = basic_analytics\
.join(analitycs, on=self.partition_cols, how='outer')
basic_analytics.show()
basic_analytics.select('Date').show()
max_col1.select('日期')。执行()方法中的show()将输出带有一个'日期'专栏和几个日期' 2018-03-18'作为价值观。 avg_col1.select(' Date')。show()也是如此。这完全符合预期。
但如果我保存或显示basic_analytics数据框,那么所有日期都会出现在< rawdata /'文件夹存在于数据框中。
如果我选择了一些像basic_analytics.select(' Date',' col1')这样的列,那么一切都会更好。
正如我在开头提到的那样,在filter()之后的persist()方法会阻止这种行为。
Anohter问题是,当我在HDinsight Spark claster上运行代码时,persist()也没有帮助..