没有缓存的Spark DF行为

时间:2018-03-21 16:31:30

标签: apache-spark pyspark spark-dataframe pyspark-sql

我无法找到一个明确的(对我这样的新手)在线答案。

如果我创建一个spark df(使用pyspark,如果重要的话,我认为不会这样做),如:

new_df = spark.sql ("select * from old_df)
print(new_df.count())

1)由于count()命令,new_df现在是否存在?

2)如果我改为使用new_df.show(5)而不是count(),这会将答案更改为#1吗?

如果我这样做

new_df =new_df.withColumn('foo', new column formula)
print(new_df.count())

3)创建new_dt的初始步骤是否会在创建新列之前重新运行?

4)new_DF.cache()会改变回复吗?

我对实际运行的内容感到困惑,如果越来越多的步骤得到了重新启动,或者使用DF进行了更改。

编辑:

我对第4号的意思是命令序列是:

 new_df = spark.sql ("select * from old_df)
 print(new_df.count())
 **new_df.cache()**
 new_df =new_df.withColumn('foo', new column formula)
 print(new_df.count())

与没有 new_df.cache()的相同,这会保留第二个  print(new_df.count())从old_df触发重建new_df,假设old_df没有被缓存。

2 个答案:

答案 0 :(得分:1)

Spark有ActionsTransformations

操作

df.count()一样的操作实际上可以正常工作,并且可以返回新的数据帧。

转换

转换(如spark.sql("select * from old_df"))不会创建新的数据帧。这些创建了一个DAG,就像新数据帧的配方一样。

您的问题,总结

1)由于count()命令,现在是否存在new_df? 的

2)如果我改为使用new_df.show(5)而不是count(),这会将答案更改为#1吗? 不,他们都是行动

3)创建new_dt的初始步骤是否在创建新列之前重新运行? 可能,但这取决于Spark的优化器

4)new_DF.cache()会改变响应吗?
不,cache()是一项懒惰的操作

我对实际运行的事情感到困惑,如果越来越多的事情通过DF完成或改变,步骤就会变得越来越重要。

如果您想了解更多信息,我建议您尝试使用像https://docs.databricks.com/_static/notebooks/cs100x-2015-introduction-to-big-data/module-2--spark-tutorial-lab.html这样的数据库笔记本之一。 他们的最新着作 Spark:The Definitive Guide 也是一流的

答案 1 :(得分:1)

获得这些问题答案的最佳位置是有关RDD,转换和操作的文档。这是here in the Spark documentation

简要回答你的问题:

  1. 由于count()命令,现在是否存在new_df?
    数据框在定义时存在(new_df = spark.sql ("select * from old_df))。但是,由于对Spark的惰性评估,计算会延迟到new_df.count()执行。

  2. 如果我改为使用new_df.show(5)而不是count(),这会将答案更改为#1吗?

  3. 创建new_dt的初始步骤是否会在创建新列之前重新运行?
    这取决于new_df的父母。如果缓存了old_df,则不会重新运行这些步骤,因为结果已经计算好并可供后续使用。

  4. new_DF.cache()会更改回复吗?
    cache()导致在执行第一个操作时缓存结果/数据。只要数据仍在内存中(在调用unpersist之前),对数据框或其后代的后续操作将不会导致new_df的计算完成。
    所以答案是否定的,因为你只在new_df上只调用一次动作。