【问题标题】:Repartition in Spark - SQL APISpark 中的重新分区 - SQL API
【发布时间】:2020-06-24 02:39:02
【问题描述】:

我们使用 Spark 的 SQL API 对集群上的Hive 表执行查询。如何在 SQL-API 中对查询中的列执行REPARTITION ?请注意,我们不使用 Dataframe API,而是使用 SQL API(例如 SELECT * from table WHERE col = 1)。

我了解 PySpark-SQL 在 Dataframe API 中提供了相同的功能。

但是,我想知道通过 SQL-API(通过 SELECT 语句)在 SQL 查询中指定 REPARTITION(在特定列上)的语法。

考虑以下查询:

select a.x, b.y
from a
JOIN b
on a.id = b.id

感谢任何帮助。

我们使用 Spark 2.4

谢谢

【问题讨论】:

    标签: apache-spark apache-spark-sql


    【解决方案1】:

    您可以提供提示以在 spark sql 中启用重新分区

    spark.sql('''SELECT /*+ REPARTITION(colname) */ col1,col2 from table''')
    

    【讨论】:

    • 谢谢.. 除了列名,是否可以指定表和编号。提示中的分区数?例如/*+ REPARTITION(20, table, col) */
    • 可以提供类似于dataframe API的sql提示。我认为我们不能提供表名
    【解决方案2】:

    您可以同时使用两者,但使用 %sql,请从手册中使用:

    DISTRIBUTE BY
    

    根据一组表达式重新分区关系中的行。具有相同表达式值的行将被散列到同一个工作人员。您不能将其与 ORDER BY 或 CLUSTER BY 一起使用。

    这一切都等同于同一件事。 IE。 shuffle 发生,也就是说你不能消除它,只是替代接口。当然,这只是因为采用了“惰性”评估。

    %sql
    SELECT * FROM boxes DISTRIBUTE BY width  
    SELECT * FROM boxes DISTRIBUTE BY width SORT BY width
    

    根据其他答案,这是 %sql 方法中提示的替代方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-03-02
      • 2019-08-26
      • 2022-08-03
      • 1970-01-01
      • 2015-10-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多