【问题标题】:Do we must make a complex query in PySpark or a simple, and use .filter / .select?我们必须在 PySpark 中进行复杂查询还是使用 .filter / .select 进行简单查询?
【发布时间】:2020-10-20 10:35:23
【问题描述】:

我有一个问题。假设我在存储数据的服务器上运行 python 脚本。有什么更快的方法可以让我的数据在以下之间产生火花数据框:

  • 进行包含大量条件的复杂查询,但它会返回我需要的确切数据帧或
  • 进行一个简单的查询并使用 .filter / .select 创建我需要的数据框

您还可以假设我需要的数据框足够小以适合我的 RAM。

谢谢

【问题讨论】:

  • 我总是会加载尽可能少的数据,尤其是在我使用 RDD API 的情况下。如果您使用的是数据帧,那么除非要管理内存,否则可能没关系。除此之外,这是一个测试数据源的查询执行和索引与 spark 执行该过滤器之间的性能差异的问题。

标签: python sql apache-spark pyspark


【解决方案1】:

要记住的关键点是

  1. 在加载到数据帧时将数据限制/过滤到最大可能级别,以便只有需要的数据驻留在数据帧中

    对于非文件源:使用本机过滤器在源头过滤数据并仅获取需要的列(旨在实现最少的数据传输)。

    对于文件源:限制/修改文件源中的数据是不可行的。所以第一个操作是在加载后过滤数据

  2. 在复杂的操作中,首先执行窄转换(过滤器,只选择需要的列),然后执行宽转换(连接,排序),这涉及到最后的 shuffle,以便在工作节点之间混洗的数据更少。

洗牌越少,最终数据帧的速度就越快。

【讨论】:

    【解决方案2】:

    IIUC,一切都取决于你从哪里读取数据,所以这里有一些场景

    数据源:RDBMS(oracle, postgres, mysql....)

    如果你想从 RDBMS 系统中读取数据,那么你必须建立一个到数据库的 JDBC 连接然后获取结果。

    现在请记住,当通过 JDBC 从关系数据库获取数据时,spark 很慢,建议您在数据库端过滤大部分记录,因为它允许通过网络传输最少的数据

    您可以使用一些调整参数来控制读取速度,但仍然很慢。

    数据源:Redshift、雪花

    在这种情况下,如果您的集群很大且相对空闲,则将查询下推到集群本身,或者如果您想使用 JDBC 读取数据,那么它也很快,因为 BTS 将数据卸载到临时位置然后触发读取它作为文件源。

    数据源:文件

    始终尝试下推过滤器,因为它们在那里是有原因的,这样您的集群需要做最少的工作,因为您只读取所需的数据。

    底线是您应该始终尝试下推源上的过滤器以使您的火花作业更快。

    【讨论】:

      【解决方案3】:

      首先,我认为在 Spark 程序中处理小数据时应该小心。它旨在为您提供大数据的并行处理。 其次,我们有 Catalyst 查询优化器和惰性评估之类的东西,它是 Spark 优化 SQL 查询或 API 调用转换中所有内容的好工具。

      【讨论】:

      • 那么结论是什么?
      猜你喜欢
      • 2023-04-03
      • 2011-04-03
      • 1970-01-01
      • 1970-01-01
      • 2018-06-23
      • 1970-01-01
      • 2017-09-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多