¿Alguien puede explicarme por qué estoy obteniendo resultados diferentes para estos 2 expresiones ? Estoy tratando de filtro entre 2 fechas:

df.filter("act_date <='2017-04-01'" and "act_date >='2016-10-01'")\
  .select("col1","col2").distinct().count()

Resultado : 37M

vs

df.filter("act_date <='2017-04-01'").filter("act_date >='2016-10-01'")\
  .select("col1","col2").distinct().count()

Resultado: 25M

La forma en que son diferentes ? Me parece que deberían producir el mismo resultado

OriginalEl autor femibyte | 2017-08-31

2 Comentarios

  1. 16

    TL;DR A pasar varias condiciones para filter o where uso Column objetos y operadores lógicos (&, |, ~). Ver Pyspark: varias condiciones en la cláusula when.

    df.filter((col("act_date") >= "2016-10-01") & (col("act_date") <= "2017-04-01"))

    También puede utilizar una sola cadena SQL:

    df.filter("act_date >='2016-10-01' AND act_date <='2017-04-01'")

    Que en la práctica tiene más sentido utilizar entre:

    df.filter(col("act_date").between("2016-10-01", "2017-04-01"))
    df.filter("act_date BETWEEN '2016-10-01' AND '2017-04-01'")

    El primer enfoque no es la distancia, incluso válido. En Python, and devuelve:

    • El último elemento, si todas las expresiones son «truthy».
    • La primera «falsey» elemento de otra manera.

    Como resultado

    "act_date <='2017-04-01'" and "act_date >='2016-10-01'"

    se evalúa (cualquier cadena no vacía es truthy):

    "act_date >='2016-10-01'"

    OriginalEl autor zero323

  2. 0

    Que en el primer caso

    df.filter("act_date <='2017-04-01'" and "act_date >='2016-10-01'")\
      .select("col1","col2").distinct().count()

    el resultado es que los valores de más de 2016-10-01 lo que significa que todos los valores por encima de 2017-04-01 también.

    Mientras que en el segundo caso

    df.filter("act_date <='2017-04-01'").filter("act_date >='2016-10-01'")\
      .select("col1","col2").distinct().count()

    el resultado es que los valores entre 2016-10-01 a 2017-04-01.

    OriginalEl autor Ash Man

Dejar respuesta

Please enter your comment!
Please enter your name here