gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 13:35:00 25 4
gpt4 key购买 nike

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

在spark sql中,我可以通过两种方式执行此操作:

  • 行转换,其中逐一解析I的整个行(例如:映射函数)以生成O行。
  • 使用我想在列级别上工作的UDF,即以I的现有列作为输入并产生O的相应列之一,即使用50个UDF函数。

  • 考虑到我正在处理整个输入表I并产生全新的输出表O(即它的a),我想知道以上2个中的哪一个效率更高(更高的分布式和并行处理),以及为什么或它们是否同样快速/高效。批量数据处理。

    最佳答案

    我本来要写关于Catalyst optimizer的全部内容,但仅注意Jacek Laskowski在他的《精通Apache Spark 2:

    “由于UDF是Spark的黑匣子,因此在恢复使用自己的自定义UDF函数之前,请尽可能将高级标准的基于列的函数与数据集运算符一起使用,因此它甚至不尝试对其进行优化。”

    Jacek还注意到Spark开发团队中某人的评论:

    “在很简单的情况下,我们可以分析UDF的字节码并推断出它在做什么,但是通常很难做到。”

    这就是为什么Spark UDF永远不应该成为您的首选。

    Cloudera post也表达了同样的观点,作者说:“...使用Apache Spark的内置SQL查询功能通常会带来最佳性能,并且应该成为可避免引入UDF的第一种方法。”

    但是,作者还正确地指出,随着Spark变得越来越聪明,这种情况将来可能会改变,与此同时,如果您不介意与Catalyst优化器紧密结合,则可以使用Chris regreg的talk中所述的Expression.genCode

    关于sql - spark sql-是否使用行转换或UDF,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43411234/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com