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中我可以用两种方式做到这一点:
我想知道上面2中的哪一个更有效(更高的分布式和并行处理)以及为什么或如果它们同样快速/高性能,因为我正在处理整个输入表I并生成全新的输出表O即它的a批量数据处理.
我打算写一下关于Catalyst优化器的全部内容,但更简单的是要注意Jacek Laskowski在他的着作" 掌握Apache Spark 2"中所说的内容:
" 在使用自己的自定义UDF函数之前,尽可能使用带有数据集运算符的更高级别标准的基于列的函数,因为UDF是Spark的黑盒子,因此它甚至不会尝试优化它们. "
Jacek还注意到Spark开发团队的一位评论:
" 在一些简单的情况下,我们可以分析UDF字节代码并推断它在做什么,但一般来说这很难做到. "
这就是为什么Spark UDF永远不应该是你的第一选择.
同样的情绪在Cloudera 帖子中得到了回应,其中作者声称" ......使用Apache Spark的内置SQL查询函数通常会带来最佳性能,并且应该是第一种可以避免引入UDF的方法. "
但是,作者还正确地指出,随着Spark变得更聪明,这可能会在未来发生变化,与此同时,如果您不介意与Catalyst优化器紧密耦合,您可以使用Expression.genCode
Chris Fregly的演讲中所述.