Spark Rapids:简单的HashAggregate示例

问题描述

[大家好,我是Spark Rapids的新手。我正在阅读Spark Rapids的基本介绍,其中有一个图(附上)解释了hashaggregate示例基于cpu和GPU的查询计划之间的区别。计划中的所有内容,除了最后一个阶段转换为行格式,对我来说还不清楚。任何人都可以提出背后原因的理由。]

解决方法

我没有看到参考图,但是我怀疑在您的特定查询中发生的事情归结为两种可能情况之一。

如果您的查询正在执行某种形式的数据收集回驱动程序(例如:Scala中的.show.collect或直接显示查询结果),则列GPU数据需要在返回驱动程序之前将其转换回行。最终,驱动程序正在使用RDD[InternalRow],这就是为什么在这种情况下需要从RDD[ColumnarBatch]过渡的原因。

如果查询通过将输出写入文件(例如:写入Parquet或ORC)而结束,则该计划通常会显示最终的GpuColumnarToRow过渡。当Spark的Catalyst优化器看到能够产生列输出的操作(即:ColumnarToRow)时,它会自动插入RDD[ColumnarBatch]过渡,然后,当前一个节点将运行时,插件会将这些过渡更新为GpuColumnarToRow在GPU上但是,在这种情况下,查询节点是数据写入命令,并且从查询计划的角度来看,这些命令不会产生任何输出。执行节点时,将输出直接写入文件,而不是将输出发送到下游节点进行进一步处理。因此,实际上这是一个简并的过渡,因为数据写入命令不会将任何数据发送到列到行的过渡。我filed an issue against the RAPIDS Accelerator清理了这种退化的过渡,但对查询性能没有影响。