pyspark sql сумма против аггр - PullRequest
0 голосов
/ 16 апреля 2020

Что из перечисленного лучше в Pyspark?
Имеет ли второй запрос какое-либо преимущество / повышение производительности по сравнению с первым запросом в PySpark (в режиме кластера)?

    #1) without using aggr
    total_distance_df = spark.sql("SELECT sum(distance) FROM flights")\
        .withColumnRenamed('sum(CAST(distance AS DOUBLE))', 'total_distance')
    total_distance_df.show()

    Vs

    #2) with using aggr
    total_distance_df = spark.sql("SELECT distance FROM flights")\
                             .agg({"distance":"sum"})\
                             .withColumnRenamed("sum(distance)","total_distance")
    total_distance_df.show()

1 Ответ

1 голос
/ 16 апреля 2020

Оба одинаковы, проверьте план explain на запросы, чтобы увидеть любые различия.

Example:

#sample df
 df1.show()
+---+--------+
| id|distance|
+---+--------+
|  a|       1|
|  b|       2|
+---+--------+

df1.createOrReplaceTempView("tmp")

spark.sql("SELECT sum(distance) FROM tmp").withColumnRenamed('sum(CAST(distance AS DOUBLE))', 'total_distance').explain()
#== Physical Plan ==
#*(2) HashAggregate(keys=[], functions=[sum(distance#179L)])
#+- Exchange SinglePartition
#   +- *(1) HashAggregate(keys=[], functions=[partial_sum(distance#179L)])
#      +- *(1) Project [distance#179L]
#         +- Scan ExistingRDD[id#178,distance#179L]

spark.sql("SELECT distance FROM tmp").agg({"distance":"sum"}).explain()
#== Physical Plan ==
#*(2) HashAggregate(keys=[], functions=[sum(distance#179L)])
#+- Exchange SinglePartition
#   +- *(1) HashAggregate(keys=[], functions=[partial_sum(distance#179L)])
#      +- *(1) Project [distance#179L]
#         +- Scan ExistingRDD[id#178,distance#179L]

Как видите, планы одинаковы как для СУМ, так и для аггр.

...