spark问题:如果我不缓存Dataframe,那么它会运行多次吗?

qvtsj1bj  于 2021-07-14  发布在  Spark
关注(0)|答案(1)|浏览(378)

如果我不缓存使用sparksql和limit选项生成的Dataframe,那么每当我编辑结果Dataframe并显示它时,会有不稳定的结果吗?
描述。
我有一个如下的表,它是通过使用带limit选项的spark sql生成的:

+---------+---+---+---+---+
|partition|   |  0|  1|  2|
+---------+---+---+---+---+
|        0|  0|  0| 10| 18|
|        1|  0|  0| 10| 17|
|        2|  0|  0| 13| 17|
+---------+---+---+---+---+

如果我加一列得到行和 show() 同样,Dataframe有如下不同的项:

+---------+---+---+---+---+-------+-----------+------------+------------------+------------------+
|partition|   |  0|  1|  2|row_sum|percent of |percent of 0|      percent of 1|      percent of 2|
+---------+---+---+---+---+-------+-----------+------------+------------------+------------------+
|        0|  0|  0| 10| 13|     23|        0.0|         0.0| 43.47826086956522| 56.52173913043478|
|        1|  0|  0| 13| 16|     29|        0.0|         0.0|44.827586206896555|55.172413793103445|
|        2|  0|  0| 15| 14|     29|        0.0|         0.0|51.724137931034484|48.275862068965516|
+---------+---+---+---+---+-------+-----------+------------+------------------+------------------+

我怀疑用于编辑从第一个sparksql查询获得的原始Dataframe的代码将导致重新运行第一个sparksql查询并从新结果进行编辑。
这是真的吗?

new9mtju

new9mtju1#

Cache() 在spark中是一个转换,当您调用该Dataframe上的任何操作时,它会被延迟地计算。
现在,如果您正在使用limit编写一个只获取10条记录的查询,那么当您调用以下操作时 show 它将具体化代码,并在那个时候得到10条记录。现在,如果您没有缓存Dataframe,并且如果您执行多次转换并再次对新创建的Dataframe执行操作,那么spark将从图的根执行转换,这就是为什么如果您没有缓存该Dataframe,每次都会看到不同的输出。

相关问题