He tratado de buscar un poco, pero sólo pudo encontrar add_month función en la Chispa de SQL, por lo tanto, terminar de abrir un nuevo hilo aquí. Agradecería cualquier ayuda que alguien podía ofrecer.

Estoy tratando de agregar horas de 12, 24, y 48 a una columna de la fecha en la Chispa de SQL utilizando sqlContext. Estoy utilizando la versión 1.6.1 de Chispa y necesito algo como esto:

SELECT N1.subject_id, '12-HOUR' AS notes_period, N1.chartdate_start, N2.chartdate, N2.text
FROM NOTEEVENTS N2,
(SELECT subject_id, MIN(chartdate) chartdate_start
  FROM NOTEEVENTS
  WHERE subject_id = 283
  AND category != 'Discharge summary'
GROUP BY subject_id) N1
WHERE N2.subject_id = N1.subject_id
and n2.chartdate < n1.chartdate_start + interval '1 hour' * 12

Por favor, nótese que la última cláusula, que está escrito en PostgreSql, y es lo que necesito en la Chispa de la SQL. Agradecería cualquier ayuda que pudiera conseguir.

Gracias.

InformationsquelleAutor Ahsan | 2016-11-30

3 Comentarios

  1. 9

    Actualmente no existe tal función, pero usted puede escribir UDF:

    sqlContext.udf.register("add_hours", (datetime : Timestamp, hours : Int) => {
        new Timestamp(datetime.getTime() + hours * 60 * 60 * 1000 )
    });
    

    Por ejemplo:

    SELECT N1.subject_id, '12-HOUR' AS notes_period, N1.chartdate_start, N2.chartdate, N2.text
        FROM NOTEEVENTS N2,
        (SELECT subject_id, MIN(chartdate) chartdate_start
          FROM NOTEEVENTS
          WHERE subject_id = 283
          AND category != 'Discharge summary'
        GROUP BY subject_id) N1
        WHERE N2.subject_id = N1.subject_id
        and n2.chartdate < add_hours(n1.chartdate_start, 12)
    

    También puede utilizar unix_timestamp función para calcular la nueva fecha. Es menos legible en mi opinión, pero puede utilizar WholeStage Código de Generación de Código inspirado por Anton Okolnychyi otra respuesta

    import org.apache.spark.sql.functions._
    val addMonths = (datetime : Column, hours : Column) => {
         from_unixtime(unix_timestamp(n1.chartdate_start) + 12 * 60 * 60)
    }
    
    • Genial 🙂 Si tienes problemas de rendimiento, y luego mirar Anton Okolnychyi respuesta – funciones nativas que tiene posibilidad de ser empujado hacia abajo. Pero en este caso creo que no habrá posibilidad para empujar hacia abajo predicado, tal como opera en algunas de las tablas, de modo UDF se debe aceptar y más sencillo de leer
  2. 13

    Mismo como en PostgreSQL, puede utilizar INTERVAL. En SQL

    spark.sql("""SELECT current_timestamp() AS now, 
                        current_timestamp() + INTERVAL 12 HOURS AS now_plus_twelve"""
    ).show(false)
    +-----------------------+-----------------------+
    |now                    |now_plus_twelve        |
    +-----------------------+-----------------------+
    |2017-12-14 10:49:15.115|2017-12-14 22:49:15.115|
    +-----------------------+-----------------------+

    Con Dataset – Scala:

    import org.apache.spark.sql.functions.{current_timestamp, expr}
    
    spark.range(1)
      .select(
        current_timestamp as "now", 
        current_timestamp + expr("INTERVAL 12 HOURS") as "now_plus_twelve"
      ).show(false)
    +-----------------------+-----------------------+
    |now                    |now_plus_twelve        |
    +-----------------------+-----------------------+
    |2017-12-14 10:56:59.185|2017-12-14 22:56:59.185|
    +-----------------------+-----------------------+

    Python:

    from pyspark.sql.functions import current_timestamp, expr
    
    (spark.range(1).select(
        current_timestamp().alias("now"), 
        (current_timestamp() + expr("INTERVAL 12 HOURS")).alias("now_plus_twelve")))
    • Esto realmente funciona!
    • Esto es más limpio y mejor solución. Funciona correctamente!
  3. 8

    Lo que sobre el uso de la unix_timestamp() función para convertir una fecha a una marca de tiempo en segundos y, a continuación, añadir hours * 60 * 60 a ella?

    Entonces su condición de aspecto:

    unix_timestamp(n2.chartdate) < (unix_timestamp(n1.chartdate_start) + 12 * 60 * 60)

    • He intentado esto, y es perfectamente viable y buena solución. Yo sólo estaba pensando si hay algo así como un add_month. Gracias.
    • he probado esta solución en la chispa.sql para normalizar cada 5 min a intervalos: from_unixtime(int(unix_timestamp(sustituir(time_route,'»‘,»))/300)*300+ 7200) como time_route,

Dejar respuesta

Please enter your comment!
Please enter your name here