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.