#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. Ты мой герой, ты даже замечаешь мои ошибки при публикации. Это сработало отлично.