我在Spark中有一个表,用一个列year_month进行分区(例如2020-01,2020-02),但是所有的查询都是用一个不同的列来完成的,year_month是派生日期(例如2020-01-30,2020-02-28)。每个月只有一条记录,日期列是所有查询中使用的列,year_month在任何地方都没有使用。主要的问题是,在这种情况下,它将作为一个分区来提高性能,还是在每个查询中读取所有表,因为日期不是分区列。
cwtwac6a1#
是的,您需要将partitionBy列作为查询过滤器中的一列添加,以使它们有效。Spark无法知道日期和分区列严格相关。你可以做的是添加一个过滤条件,例如从日期派生,但在任何情况下,你必须指定year_month列。您可以通过myQuery.explainPlan API(这里是SQL API的参考,但其他语言也是如此)来探索它的使用。在这里,您将看到所涉及的分区数量(如果使用正确的过滤器,则应该是一个),所涉及的parquet文件数量,以及有关查询及其执行的其他有趣信息。解释SQL:https://spark.apache.org/docs/latest/sql-ref-syntax-qry-explain.html解释Scala:https://spark.apache.org/docs/latest/api/scala/org/apache/spark/sql/Dataset.html#explain(extended:Boolean):单位
year_month
myQuery.explainPlan
1条答案
按热度按时间cwtwac6a1#
是的,您需要将partitionBy列作为查询过滤器中的一列添加,以使它们有效。Spark无法知道日期和分区列严格相关。
你可以做的是添加一个过滤条件,例如从日期派生,但在任何情况下,你必须指定
year_month
列。您可以通过
myQuery.explainPlan
API(这里是SQL API的参考,但其他语言也是如此)来探索它的使用。在这里,您将看到所涉及的分区数量(如果使用正确的过滤器,则应该是一个),所涉及的parquet文件数量,以及有关查询及其执行的其他有趣信息。
解释SQL:https://spark.apache.org/docs/latest/sql-ref-syntax-qry-explain.html
解释Scala:https://spark.apache.org/docs/latest/api/scala/org/apache/spark/sql/Dataset.html#explain(extended:Boolean):单位