web-dev-qa-db-fra.com

Filtrer une image de données spark en fonction de la date

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. 

18
Steve

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))) 
36
eliasah

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()
2
Prathap Kudupu

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.

0
Ruurtjan Pul