Tengo el siguiente DataFrame, tiene claves con diferentes fechas fuera de las cuales me gustaría mostrar la última fecha junto con el recuento de cada uno de los pares de clave-id.

Ingrese los datos de la siguiente manera:

id  key  date 
11  222  1/22/2017
11  222  1/22/2015
11  222  1/22/2016 
11  223  9/22/2017 
11  223  1/22/2010 
11  223  1/22/2008

Código que he intentado:

val counts = df.groupBy($"id",$"key").count()

Obtengo el siguiente resultado,

id  key  count 
11  222   3
11  223   3

Sin embargo, quiero que la salida sea la siguiente:

id  key  count maxDate 
11  222   3    1/22/2017 
11  223   3    9/22/2017
3
lak 30 ene. 2018 a las 09:53

1 respuesta

Una forma sería transformar la fecha en tiempo único, hacer la agregación y luego convertirla nuevamente. Estas conversiones desde y hacia unixtime se pueden realizar con unix_timestamp y from_unixtime respectivamente. Cuando la fecha está en horario único, la última fecha se puede seleccionar encontrando el valor máximo. El único inconveniente posible de este enfoque es que el formato de fecha debe proporcionarse explícitamente.

val dateFormat = "MM/dd/yyyy"

val df2 = df.withColumn("date", unix_timestamp($"date", dateFormat))
  .groupBy($"id",$"key").agg(count("date").as("count"), max("date").as("maxDate"))
  .withColumn("maxDate", from_unixtime($"maxDate", dateFormat))

Lo que te dará:

+---+---+-----+----------+
| id|key|count|   maxDate|
+---+---+-----+----------+
| 11|222|    3|01/22/2017|
| 11|223|    3|09/22/2017|
+---+---+-----+----------+
1
Shaido - Reinstate Monica 30 ene. 2018 a las 08:44