0
votes

Filtrer une étincelle Dataframe avec un plus grand que et moins que la liste des dates

J'ai un dataframe code> avec les champs de_date code> et to_date code>: xxx pré>

et une liste de DATES P>

spark.sql("select * from dataframe_table where from_date  >= (select  date from date_list) AND  to_date  <= (select date from date_list)")


2 commentaires

Qu'est-ce que tu as essayé jusque-là? Considérez la lecture Comment demander pour améliorer votre question.


Pourriez-vous ajouter la sortie attendue à la question?


3 Réponses :


0
votes

Si vous souhaitez comparer plusieurs rangées d'une table avec plusieurs rangées d'une autre table (tenant compte de votre liste de dates comme une table avec une seule colonne), vous pouvez utiliser une jointure sur les deux tables. Généralement, vous testez les colonnes des tables sur l'égalité. Dans ce cas, votre test est un peu plus spécial puisque vous souhaitez comparer deux colonnes de votre première table avec une colonne dans la seconde. Vous pouvez utiliser DATAFIFF pour ce:

scala> val df1 = Seq(("2017-01-10", "2017-01-14")).toDF("start_date","end_date").withColumn("start_date",'start_date.cast("date")).withColumn("end_date",'end_date.cast("date"))

df1: org.apache.spark.sql.DataFrame = [start_date: date, end_date: date]

scala> val df2 = Seq("2017-01-5", "2017-01-12","2017-01-13", "2017-01-15").toDF("from_date").withColumn("from_date",'from_date.cast("date"))
df2: org.apache.spark.sql.DataFrame = [from_date: date]

scala> df2.join(df1, datediff('from_date,'start_date) > 0) && datediff('from_date,'end_date) < 0)).show()


0 commentaires

0
votes

Votre question est légèrement déroutante pour moi, donc j'ai fourni un code basé sur deux scénarios.

1) Si vous souhaitez filtrer la date entre une gamme de liste que vous avez fournie, comme du 5 janvier 2017 au 15 janvier. 2017 Donc, pour cette affaire au-dessous du code TRAVAILLE DE CODE SNIPPET. P>

//Created dataframe view for both data
       Seq(("2017-01-10", "2017-01-14"),("2017-01-03","2017-01-13")).toDF("from_date","to_date").withColumn("from_date",'from_date.cast("date")).withColumn("to_date",'to_date.cast("date")).createOrReplaceTempView("date_table")


        List("2017-01-05","2017-01-12","2017-01-13","2017-01-15").toDF("list").createOrReplaceTempView("date_list")

        spark.sql("select * from date_table where from_date in (select cast(list as date) from date_list) and to_date in (select cast(list as date) from date_list)").show() 

    +----------+----------+
    |from_date|  to_date|
    +----------+----------+
    |            |            |
    +----------+----------+


2 commentaires

Désolé pour mon anglais ! J'ai une table avec deux champs: de_date et to_date. et séparé une liste avec des dates. L'idée est de récupérer de la table toutes les lignes dans lesquelles cette liste de date est comprise entre di_date et to_date.


Aucun problème!! Selon votre production attendue, j'ai déjà fourni une solution pour cela. Vous pouvez le prendre comme référence. S'il vous plaît vérifier ma première solution. J'ai utilisé entre ..et opérateur en état d'utilisation, si vous souhaitez utiliser> =, <= opérateur pour la plage, vous pouvez remplacer la même chose dans la condition. :) sinon allez avec ma nouvelle solution fournie ci-dessous qui résoudra votre problème.



0
votes

Veuillez vérifier ceci:

//Creating DataFrame with Column from_date and to_date, you can ignore this step if you have dataframe

scala> val df =  Seq(("2017-01-10", "2017-01-14"),("2017-01-03","2017-01-13")).toDF("from_date","to_date").withColumn("from_date", col("from_date").cast("date")).withColumn("to_date",col("to_date").cast("date"))
df: org.apache.spark.sql.DataFrame = [from_date: date, to_date: date]

scala> df.show()
+----------+----------+
| from_date|   to_date|
+----------+----------+
|2017-01-10|2017-01-14|
|2017-01-03|2017-01-13|
+----------+----------+

//creating temparary View for dataframe "df" so that we can use it in spark sql.
scala> df.createOrReplaceTempView("dataframe_table")

//Converting List into Temp view
List("2017-01-05","2017-01-12","2017-01-13","2017-01-15").toDF("list").createOrReplaceTempView("date_list")


//Query to retrive all data from dataframe where from_date and to_date are in range of list.

scala> val output =  spark.sql("select * from dataframe_table where from_date  >= (select min(cast(list as date)) from date_list) AND  to_date  <= (select max(cast(list as date)) from date_list)")
output: org.apache.spark.sql.DataFrame = [from_date: date, to_date: date]

scala> output.show()
+----------+----------+                                                         
| from_date|   to_date|
+----------+----------+
|2017-01-10|2017-01-14|
+----------+----------+


2 commentaires

Merci nikk !! Mais je veux comparer avec toute la liste, non seulement avec le minimum ou le maximum;)


Confusion toujours, pourriez-vous fournir le résultat attendu des données données ou si vous pouvez ajouter plus de date dans DataFream et la liste et fourni le résultat de la sortie qui m'aidera à résoudre votre problème.