Tengo un dataframe log_df:
Cómo llegar el día de la semana desde el primer día de mes utilizando pyspark

Puedo generar una nueva dataframe basado en el código siguiente:

from pyspark.sql.functions import split, regexp_extract 
split_log_df = log_df.select(regexp_extract('value', r'^([^\s]+\s)', 1).alias('host'),
                          regexp_extract('value', r'^.*\[(\d\d/\w{3}/\d{4}:\d{2}:\d{2}:\d{2} -\d{4})]', 1).alias('timestamp'),
                          regexp_extract('value', r'^.*"\w+\s+([^\s]+)\s+HTTP.*"', 1).alias('path'),
                          regexp_extract('value', r'^.*"\s+([^\s]+)', 1).cast('integer').alias('status'),
                          regexp_extract('value', r'^.*\s+(\d+)$', 1).cast('integer').alias('content_size'))
split_log_df.show(10, truncate=False)

la nueva dataframe es como:
Cómo llegar el día de la semana desde el primer día de mes utilizando pyspark

Necesito otra columna que muestra el dayofweek, ¿cuál sería la mejor manera elegante para crear? idealmente sólo la adición de una udf como campo en la instrucción select.

Muchas gracias.

Actualizado: mi pregunta es distinta a la que en el comentario, lo que necesito es hacer el cálculo basado en una cadena en log_df, no se basa en la marca de tiempo como el comentario, así que esto no es un duplicado de la pregunta. Gracias.

  • Escribe una UDF función de python que utiliza python datetime módulo y analizar los timestamp columna.
  • Posibles duplicados de Cómo llegar el día de la semana en SparkSQL?
  • eso es exactamente lo que yo estoy pidiendo ayuda aquí, gracias.
  • Usted podría volver a formatear / cast de la columna de marca de tiempo en un formato de Fecha que Chispa acepta… esta pregunta es prácticamente un duplicado. Y usted no necesita regex extracto de la fecha de la cadena, tiene un formato estándar que puede utilizar datetime.strptime para
  • Gracias. Puede usted dar su secuencia de comandos aquí? Estoy realmente no está satisfecho con mi propia solución, publicado a continuación aquí
  • Si usted pone su actual python UDF código de la pregunta, estoy seguro de que alguien podría aportar una solución. Es sólo el código de Python que usted necesita para el campo de marca de hora, la Chispa no es realmente necesario para tu pregunta

InformationsquelleAutor mdivk | 2016-08-13

5 Comentarios

  1. 17

    Sugiero un poco diferente método

    from pyspark.sql.functions import date_format
    df.select('capturetime', date_format('capturetime', 'u').alias('dow_number'), date_format('capturetime', 'E').alias('dow_string'))
    df3.show()
    

    Da …

    +--------------------+----------+----------+
    |         capturetime|dow_number|dow_string|
    +--------------------+----------+----------+
    |2017-06-05 10:05:...|         1|       Mon|
    |2017-06-05 10:05:...|         1|       Mon|
    |2017-06-05 10:05:...|         1|       Mon|
    |2017-06-05 10:05:...|         1|       Mon|
    |2017-06-05 10:05:...|         1|       Mon|
    |2017-06-05 10:05:...|         1|       Mon|
    |2017-06-05 10:05:...|         1|       Mon|
    |2017-06-05 10:05:...|         1|       Mon|
    
  2. 1

    Hice esto para obtener los días de semana a partir de la fecha:

    def get_weekday(date):
        import datetime
        import calendar
        month, day, year = (int(x) for x in date.split('/'))    
        weekday = datetime.date(year, month, day)
        return calendar.day_name[weekday.weekday()]
    
    spark.udf.register('get_weekday', get_weekday)
    

    Ejemplo de uso:

    df.createOrReplaceTempView("weekdays")
    df = spark.sql("select DateTime, PlayersCount, get_weekday(Date) as Weekday from weekdays")
    

    Cómo llegar el día de la semana desde el primer día de mes utilizando pyspark

  3. 0

    Finalmente resuelto la pregunta a mí mismo, aquí está la solución completa:

    1. de importación date_format, datetime, Tipo de datos
    2. en primer lugar, modificar la regexp para extraer 01/Jul/1995
    3. convertir 01/Jul/1995 a DateType el uso de func
    4. crear un archivo udf dayOfWeek para obtener el día de la semana en formato breve (Lun, mar,…)
    5. el uso de la udf para convertir el DateType 01/Jul/1995 al día de la semana que es Sat
      Cómo llegar el día de la semana desde el primer día de mes utilizando pyspark

    No estoy satisfecho con mi solución, ya que parece ser tan zig-zag, se agradecería si alguien puede venir para arriba con una solución más elegante, gracias de antemano.

    • ¿Por qué no pones el código en tu ejemplo?
  4. 0

    esto funcionó para mí:

    recrear datos similares a los de su ejemplo:

    df = spark.createDataFrame(\
        [(1, "2017-11-01 22:05:01 -0400")\
         ,(2, "2017-11-02 03:15:16 -0500")\
         ,(3, "2017-11-03 19:32:24 -0600")\
          ,(4, "2017-11-04 07:47:44 -0700")\
        ], ("id", "date"))
    
    df.toPandas()
        id  date
    0   1   2017-11-01 22:05:01 -0400
    1   2   2017-11-02 03:15:16 -0500
    2   3   2017-11-03 19:32:24 -0600
    3   4   2017-11-04 07:47:44 -0700
    

    crear función lambda para manejar la conversión a la semana

    funcWeekDay =  udf(lambda x: datetime.strptime(x, '%Y-%m-%d').strftime('%w'))
    
    • extracto de la fecha en shortdate columna
    • crear columna con weeday, usando la función lambda
    • caída de la shortdate columna

    el código:

    from pyspark.sql.functions import udf,col
        from datetime import datetime
    
    
    df=df.withColumn('shortdate',col('date').substr(1, 10))\
         .withColumn('weekDay', funcWeekDay(col('shortdate')))\
         .drop('shortdate')
    

    resultado:

    df.toPandas()
        id  date                     weekDay
    0   1   2017-11-01 22:05:01 -0400   3
    1   2   2017-11-02 03:15:16 -0500   4
    2   3   2017-11-03 19:32:24 -0600   5
    3   4   2017-11-04 07:47:44 -0700   6
    

Dejar respuesta

Please enter your comment!
Please enter your name here