pyspark filter()并不总是被推下来

时间:2018-05-23 16:47:40

标签: python apache-spark filter pyspark

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()也没有帮助..

0 个答案:

没有答案