sparklyr- 在 spark 数据框上调用 print 或 glimpse 是一项昂贵的操作吗?它是如何进行的?

sparklyr- is calling print or glimpse on a spark data frame an expensive operation? how is it performed?

我试图理解 sparklyr 中的惰性求值,并发现了一些我不确定是否有意为之的行为。

我有一个很大的 table,有 100 亿行,叫做 'records',比方说。

dat <- tbl(sc, 'records') 

当我输入以下命令时到底发生了什么:

dat
print (dat) 
glimpse(dat) 

我本以为,因为 none 这些命令实际上 return 关于全部行数的信息,所以会有一个聪明的方法只收集十行左右的行并打印这些.我还希望这也非常快,并且通常与 table 的大小无关。

当我实际上 运行 在我的大 table 上执行这些命令时,它几乎什么都不做。在稍微监控一下后端之后,似乎 spark 正试图将整个 table 聚集在一起。 当我在较小的 tables 上做同样的事情时,比如说,只有 10 000 行。上述命令的结果大约需要一分钟左右。

我发现这种行为令人惊讶 - 是否缺少某些文档?我是不是想错了,还是我的设置配置有误?

谢谢,任何 help/guidance 非常感谢。

gathers ten or so rows (...) I would also expect this to be super fast as well and generally independent of the size of the table.

这不是合理的期望。在某些非常具体的情况下(对数据没有限制,上游没有广泛的转换,统一的数据分布,distribution-friendly 输入格式,缓存)可能是正确的,但在一般情况下,执行时间将高度依赖于总体执行计划。

总体:

  • "Wide transformations" 像聚合或不同会导致对整个数据集进行评估,但限制排序除外(对于相当少的行数)。
  • 高度限制的选择 (filter) 将导致在最坏的情况下评估所有分区(通常如果无法从前几个分区收集所需的行数)。
  • 任何不能保证正确数据分布的输入格式(如 gzip 文件或默认 JDBC 连接器)将评估比生成输出所需的更多数据。