减少pyspark数据帧中的依赖项数量

减少pyspark数据帧中的依赖项数量,pyspark,pyspark-dataframes,Pyspark,Pyspark Dataframes,我正在运行Pypark流媒体工作。对于每个rdd,我都会使用一些要缓存的新数据更新一个临时表,如下所示: def forach_rdd(rdd): sqlContext = SQLContext(rdd.context) cached_data_df = sqlContext.sql("SELECT * FROM temp_table WHERE UPDATED_ON >= NOW() - INTERVAL 24 HOUR") external_df = sqlC

我正在运行Pypark流媒体工作。对于每个rdd,我都会使用一些要缓存的新数据更新一个临时表,如下所示:

def forach_rdd(rdd):
    sqlContext = SQLContext(rdd.context)
    cached_data_df = sqlContext.sql("SELECT * FROM temp_table WHERE UPDATED_ON >= NOW() - INTERVAL 24 HOUR")

    external_df = sqlContext.read.format("jdbc").options(
        url=config.value.get('host'),
        driver="com.mysql.jdbc.Driver",
        user=config.value.get('username'),
        password=config.value.get('password'),
        fetchsize=25000,
        query="SELECT * FROM temp_table WHERE /*SOME THRESHOLD FOR NEW VALUES*/"
    ).load()

    union_df = cached_data_df.union(external_df).coalesce(3).cache()
    union_df.createOrReplaceTempView('temp_table')

    # operate on union_df 

DStream.foreachRDD(forach_rdd)
几个小时后,由于堆栈溢出,spark作业崩溃;) 原因很可能与数据帧下不断增长的rdd依赖树有关

我的问题是:如何强制spark使用更新的数据创建新的dataframe,但不使用依赖关系历史

我想下面的方法可能会奏效,但似乎效率不高:

sc.parallelize(union_df.collect()).toDF(union_df.schema)
有没有更好的办法?我欢迎任何提示

[编辑]我将异常堆栈跟踪上载到pastebin,因为它有点长:

首先用一个急切的检查点替换缓存:

union_df = cached_data_df.union(external_df).coalesce(3).checkpoint(True)

这将暂时缓解您的问题,但您应该为流设置更健壮的检查点

您还可以发布stackoverflow异常的堆栈跟踪吗