spark sql - 是否使用行转换或UDF

sun*_*llp 18 sql user-defined-functions apache-spark apache-spark-sql

我有一个包含100列和1000万条记录的输入表(I).我想得到一个有50列的输出表(O),这些列是从I列派生出来的,即将有50个函数将I的列映射到50列O,即o1 = f(i1), o2 = f(i2,i3)...,o50 = f(i50,i60,i70).

在spark sql中我可以用两种方式做到这一点:

  1. 行转换,其中整个I行被解析(例如:map函数)逐个产生一行O.
  2. 使用我想在列级工作的UDF,即将I的现有列作为输入,并产生一个相应的O列,即使用50个UDF函数.

我想知道上面2中的哪一个更有效(更高的分布式和并行处理)以及为什么或如果它们同样快速/高性能,因为我正在处理整个输入表I并生成全新的输出表O即它的a批量数据处理.

Vid*_*dya 7

我打算写一下关于Catalyst优化器的全部内容,但更简单的是要注意Jacek Laskowski在他的着作" 掌握Apache Spark 2"中所说的内容:

" 在使用自己的自定义UDF函数之前,尽可能使用带有数据集运算符的更高级别标准的基于列的函数,因为UDF是Spark的黑盒子,因此它甚至不会尝试优化它们. "

Jacek还注意到Spark开发团队的一位评论:

" 在一些简单的情况下,我们可以分析UDF字节代码并推断它在做什么,但一般来说这很难做到. "

这就是为什么Spark UDF永远不应该是你的第一选择.

同样的情绪在Cloudera 帖子中得到了回应,其中作者声称" ......使用Apache Spark的内置SQL查询函数通常会带来最佳性能,并且应该是第一种可以避免引入UDF的方法. "

但是,作者还正确地指出,随着Spark变得更聪明,这可能会在未来发生变化,与此同时,如果您不介意与Catalyst优化器紧密耦合,您可以使用Expression.genCodeChris Fregly的演讲中所述.