Pyspark создает сводную таблицу с вычисляемыми значениями

#pyspark #apache-spark-sql #pyspark-dataframes

#apache-spark-sql #pyspark

Вопрос:

У меня есть фрейм данных, который выглядит следующим образом:

  -------------------- --------------------- ------------- ------------ ----- 
|tpep_pickup_datetime|tpep_dropoff_datetime|trip_distance|total_amount|isDay|
 -------------------- --------------------- ------------- ------------ ----- 
| 2019-01-01 09:01:00|  2019-01-01 08:53:20|          1.5|        2.00| true|
| 2019-01-01 21:59:59|  2019-01-01 21:18:59|          2.6|        5.00|false|
| 2019-01-01 10:01:00|  2019-01-01 08:53:20|          1.5|        2.00| true|
| 2019-01-01 22:59:59|  2019-01-01 21:18:59|          2.6|        5.00|false|
 -------------------- --------------------- ------------- ------------ ----- 
  

и я хочу создать сводную таблицу, которая вычисляет trip_rate для всех ночных поездок и всех дневных поездок ( total_amount столбец, разделенный на trip_distance ). Таким образом, конечный результат должен выглядеть следующим образом:

  ------------ ----------- 
| day_night  | trip_rate |
 ------------ ----------- 
|Day         | 1.33      |
|Night       | 1.92      |
 ------------ ----------- 
  

Вот что я пытаюсь сделать:

 df2 = spark.createDataFrame(
    [
        ('2019-01-01 09:01:00','2019-01-01 08:53:20','1.5','2.00','true'),#day
        ('2019-01-01 21:59:59','2019-01-01 21:18:59','2.6','5.00','false'),#night
        ('2019-01-01 10:01:00','2019-01-01 08:53:20','1.5','2.00','true'),#day
        ('2019-01-01 22:59:59','2019-01-01 21:18:59','2.6','5.00','false'),#night
    ],
    ['tpep_pickup_datetime','tpep_dropoff_datetime','trip_distance','total_amount','day_night'] # add your columns label here
)

day_trip_rate = df2.where(df2.day_night == 'Day').withColumn("trip_rate",F.sum("total_amount")/F.sum("trip_distance"))
night_trip_rate = df2.where(df2.day_night == 'Night').withColumn("trip_rate",F.sum("total_amount")/F.sum("trip_distance"))
  

Я не верю, что я даже правильно подхожу к этому. И я получаю эту ошибку: (
raise AnalysisException(s.split(': ', 1)[1], stackTrace) pyspark.sql.utils.AnalysisException: "grouping expressions sequence is empty, and ' tpep_pickup_datetime ' is not an aggregate function.

Может кто-нибудь помочь мне узнать, как подойти к этому, чтобы получить эту сводную таблицу?

Ответ №1:

 from pyspark.sql import functions as F
from pyspark.sql.functions import *

df2.groupBy("day_night").agg(F.round(F.sum("total_amount")/F.sum("trip_distance"),2).alias('trip_rate'))
        .withColumn("day_night", F.when(col("day_night")=="true", "Day").otherwise("Night")).show()

 --------- --------- 
|day_night|trip_rate|
 --------- --------- 
|      Day|     1.33|
|    Night|     1.92|
 --------- --------- 
  

Без округления:

 df2.groupBy("day_night").agg(F.sum("total_amount")/F.sum("trip_distance")).alias('trip_rate')
        .withColumn("day_night", F.when(col("day_night")=="true", "Day").otherwise("Night")).show()
  

(У вас есть day_night в df2 коде построения, но isDay в таблице отображения. Я рассматриваю имя поля как day_night здесь.)

Комментарии:

1. Еще раз спасибо Cena. Ты мой герой, ты даже замечаешь мои ошибки при публикации. Это сработало отлично.