web-dev-qa-db-ja.com

pysparkを使用して日から平日を取得する方法

データフレームlog_dfがあります: enter image description here

次のコードに基づいて新しいデータフレームを生成します。

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)

新しいデータフレームは次のようになります enter image description here

曜日を示す別の列が必要です。それを作成するための最もエレガントな方法は何ですか?理想的には、選択にudfのようなフィールドを追加するだけです。

どうもありがとうございました。

更新:私の質問はコメントの質問とは異なります。コメントのようなタイムスタンプではなく、log_dfの文字列に基づいて計算を行う必要があるため、これは重複した質問ではありません。ありがとう。

7
mdivk

私は最終的に自分で質問を解決しました、これが完全な解決策です:

  1. import date_format、datetime、DataType
  2. まず、1995年7月1日を抽出するように正規表現を変更します。
  3. funcを使用して1995年7月1日をDateTypeに変換する
  4. udf dayOfWeekを作成して、簡単な形式で曜日を取得します(月、火、...)
  5. udfを使用してDateType 01/Jul/1995を土曜日の平日に変換 enter image description here

私のソリューションはジグザグに見えるので満足していません。よりエレガントなソリューションを考え出していただければ幸いです。よろしくお願いします。

0
mdivk

私は少し違う方法を提案します

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()

それは与えます ...

+--------------------+----------+----------+
|         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|
22
Karel Marik

私はこれを日付から平日を取得するために行いました:

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)

使用例:

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

enter image description here

2

SPARK 1.5.0には、引数として形式を受け入れるdate_format関数があるため、この形式はタイムスタンプから曜日の名前を返します。

select date_format(my_timestamp, 'EEEE') from ....

結果:例「火曜日」

SparkSQLで曜日を取得する方法

1
abdelhadi danba

これは私のために働きました:

例のようなデータを再作成します。

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

週への変換を処理するラムダ関数を作成する

funcWeekDay =  udf(lambda x: datetime.strptime(x, '%Y-%m-%d').strftime('%w'))
  • shortdate列に日付を抽出する
  • ラムダ関数を使用して、weedayで列を作成する
  • shortdate列を削除する

コード:

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')

結果:

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
0
Grant Shannon