我无法找到一个明确的(对我这样的新手)在线答案。
如果我创建一个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没有被缓存。
答案 0 :(得分:1)
Spark有Actions和Transformations
与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。
简要回答你的问题:
由于count()命令,现在是否存在new_df?
数据框在定义时存在(new_df = spark.sql ("select * from old_df)
)。但是,由于对Spark的惰性评估,计算会延迟到new_df.count()
执行。
如果我改为使用new_df.show(5)而不是count(),这会将答案更改为#1吗?
否
创建new_dt的初始步骤是否会在创建新列之前重新运行?
这取决于new_df
的父母。如果缓存了old_df
,则不会重新运行这些步骤,因为结果已经计算好并可供后续使用。
new_DF.cache()会更改回复吗?
cache()
导致在执行第一个操作时缓存结果/数据。只要数据仍在内存中(在调用unpersist
之前),对数据框或其后代的后续操作将不会导致new_df
的计算完成。
所以答案是否定的,因为你只在new_df
上只调用一次动作。