Saltar al contenido

PySpark: filtrar un DataFrame por campo de fecha en el rango donde está la fecha string

Luego de de nuestra larga recopilación de información dimos con la respuesta esta dificultad que tienen muchos usuarios. Te ofrecemos la solución y esperamos serte de mucha apoyo.

Solución:

Descubrí una manera de resolver mi problema usando la API SparkSQL con fechas en formato de cadena.

Aquí hay un ejemplo:

last_week = (datetime.today() - timedelta(days=7)).strftime(format='%Y-%m-%d')

new_df = df.where(df.date >= last_week)

Puede resolver esto sin usar el código Python del lado del trabajador y cambiar a RDD. En primer lugar, dado que usa ISO 8601 stringsus datos se pueden convertir directamente en fecha o marca de tiempo:

from pyspark.sql.functions import col

df = sc.parallelize([
    ('2015-07-02T11:22:21.050Z', ),
    ('2016-03-20T21:00:00.000Z', )
]).toDF(("d_str", ))

df_casted = df.select("*",
    col("d_str").cast("date").alias("dt"), 
    col("d_str").cast("timestamp").alias("ts"))

Esto ahorrará un viaje de ida y vuelta entre JVM y Python. También hay algunas formas de abordar la segunda parte. Solo fecha:

from pyspark.sql.functions import current_date, datediff, unix_timestamp

df_casted.where(datediff(current_date(), col("dt")) < 7)

Marcas de tiempo:

def days(i: int) -> int:
    return 60 * 60 * 24 * i

df_casted.where(unix_timestamp() - col("ts").cast("long") < days(7))

También puedes echar un vistazo a current_timestamp y date_sub

Nota: Evitaría usar DataFrame.map. es mejor usar DataFrame.rdd.map en cambio. Le ahorrará algo de trabajo al cambiar a 2.0+

valoraciones y reseñas

Si te ha resultado de provecho este post, sería de mucha ayuda si lo compartes con el resto desarrolladores así contrubuyes a difundir nuestra información.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *