如何将数据存储在Pyspark中的数据框中

时间:2018-05-21 16:31:27

标签: python dataframe pyspark

我是Pyspark的新手,并试图弄清楚如何在数据框中存储数据。我的表格大小为n x 8,其中n非常大。 可以说dfx1x2x3x4x5x6x7x8列。

8个列中的4个在循环中保持不变(x1x2x3x4)并且4列更改(x5,{{ 1}},x6x7)。

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")) 我会遇到内存问题。我进行了研究并了解了50000cache函数,但无法弄清楚如何以正确的方式使用它们。

我的问题如下:

  1. 我应该存储常量列并更改不同数据框中的列(分别为persistdf1)吗?如果是这样,我应该使用df2
  2. 如果我执行d1.persist并使用df = df.cache()等操作覆盖缓存的df会怎样? df = df.withColumn("x5", col('x6'))是否仍然会被缓存,或者我应该先从内存中以某种方式清除df并稍后执行df
  3. 如何为碎片制作火花分割数据并使用它们以便我不会耗尽内存?
  4. 我试图通过调用
    来强制计算延迟变换 df = df.withColumn("x5", col('x6')).cache()这使得程序变得非常缓慢,但每次迭代都需要几乎相同的时间。这样做有什么正确的方法吗?检查点使它更慢。

1 个答案:

答案 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)