减少pyspark数据帧中的依赖项数量
我正在运行Pypark流媒体工作。对于每个rdd,我都会使用一些要缓存的新数据更新一个临时表,如下所示:减少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
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异常的堆栈跟踪吗