J'ai une dataframe de
date, string, string
Je veux sélectionner des dates avant une certaine période. J'ai essayé ce qui suit sans succès
data.filter(data("date") < new Java.sql.Date(format.parse("2015-03-14").getTime))
Je reçois une erreur indiquant ce qui suit
org.Apache.spark.sql.AnalysisException: resolved attribute(s) date#75 missing from date#72,uid#73,iid#74 in operator !Filter (date#75 < 16508);
Pour autant que je puisse deviner, la requête est incorrecte. Quelqu'un peut-il me montrer comment la requête doit être formatée?
J'ai vérifié que toutes les entrées dans le cadre de données avaient des valeurs - elles le font.
Les solutions suivantes sont applicables depuis spark 1.5 :
Pour inférieur à:
// filter data where the date is lesser than 2015-03-14
data.filter(data("date").lt(lit("2015-03-14")))
Pour plus de:
// filter data where the date is greater than 2015-03-14
data.filter(data("date").gt(lit("2015-03-14")))
Pour l'égalité, vous pouvez utiliser equalTo
ou ===
:
data.filter(data("date") === lit("2015-03-14"))
Si votre colonne de date DataFrame
est de type StringType
, vous pouvez la convertir à l'aide de la fonction to_date
:
// filter data where the date is greater than 2015-03-14
data.filter(to_date(data("date")).gt(lit("2015-03-14")))
Vous pouvez également filtrer en fonction d'une année à l'aide de la fonction year
:
// filter data where year is greater or equal to 2016
data.filter(year($"date").geq(lit(2016)))
Dans PySpark (python), l’une des options est d’avoir la colonne au format unix_timestamp.We peut convertir une chaîne en unix_timestamp et spécifier le format comme indiqué ci-dessous . Notez que nous devons importer unix_timestamp et une fonction allumée
from pyspark.sql.functions import unix_timestamp, lit
df.withColumn("tx_date", to_date(unix_timestamp(df_cast["date"], "MM/dd/yyyy").cast("timestamp")))
Maintenant nous pouvons appliquer les filtres
df_cast.filter(df_cast["tx_date"] >= lit('2017-01-01')) \
.filter(df_cast["tx_date"] <= lit('2017-01-31')).show()
N'utilisez pas ceci comme suggéré dans d'autres réponses
.filter(f.col("dateColumn") < f.lit('2017-11-01'))
Mais utilisez ceci à la place
.filter(f.col("dateColumn") < f.unix_timestamp(f.lit('2017-11-01 00:00:00')).cast('timestamp'))
Ceci utilisera la TimestampType
au lieu de la StringType
, qui sera plus performante dans certains cas. Par exemple, la compression des prédicats de parquet ne fonctionnera qu'avec ce dernier.