我是Pyspark的新手,并试图弄清楚如何在数据框中存储数据。我的表格大小为n x 8
,其中n
非常大。
可以说df
有x1
,x2
,x3
,x4
,x5
,x6
,x7
, x8
列。
8个列中的4个在循环中保持不变(x1
,x2
,x3
,x4
)并且4列更改(x5
,{{ 1}},x6
,x7
)。
x8
每次迭代都会变慢,并且n大于for i in range(1, iterations):
df = df.alias("L").join(df_second.alias("R"), (df.x1 == df_second.x1), how="left")\
.select("L.*", sum(col("w")*col("x7")).over(Window.partitionBy("x1")).alias("x8"))\
.distinct()\
.sort('x1')
df = df.withColumn("x5", col('x6'))
df = df.withColumn("x6", col('x5') - col("x1")*(col("x3") - col("x4")))
df = df.withColumn("x6", when(df.sampled > 0, df.x2).otherwise(df.x6))
df = df.withColumn("x7", 2*col('x6') - col("x5")*col("x8"))
我会遇到内存问题。我进行了研究并了解了50000
和cache
函数,但无法弄清楚如何以正确的方式使用它们。
我的问题如下:
persist
和df1
)吗?如果是这样,我应该使用df2
?d1.persist
并使用df = df.cache()
等操作覆盖缓存的df
会怎样? df = df.withColumn("x5", col('x6'))
是否仍然会被缓存,或者我应该先从内存中以某种方式清除df
并稍后执行df
?df = df.withColumn("x5", col('x6')).cache()
这使得程序变得非常缓慢,但每次迭代都需要几乎相同的时间。这样做有什么正确的方法吗?检查点使它更慢。答案 0 :(得分:0)
@ Gocht的解决方案可能更好。但这是另一种强制计算和持久性的方法。
def cache_on_parquet(df):
TEMP = 'temp.parquet'
df.write.parquet(TEMP, mode='overwrite')
return sqlc.read.parquet(TEMP)
经过一次或多次迭代
df = cache_on_parquet(df)