web-dev-qa-db-ja.com

PySparkデータフレームは、通常とは異なる文字列形式をタイムスタンプに変換します

Spark 1.5.0でPySparkを使用しています。datetime値の列の行に異常な文字列形式があります。次のようになります。

Row[(daytetime='2016_08_21 11_31_08')]

この非正統的なyyyy_mm_dd hh_mm_dd形式をタイムスタンプに変換する方法はありますか?最終的には次のようになります

df = df.withColumn("date_time",df.daytetime.astype('Timestamp'))

Spark regexp_replaceのようなSQL関数は動作するだろうと思っていましたが、もちろん、日付の半分で_-に、時間の部分で_:に置き換える必要があります。

substringを使用して列を2つに分割し、時間の終わりから逆算できると考えていました。次に、「regexp_replace」を個別に実行してから、連結します。しかし、これは多くの操作のようですか?もっと簡単な方法はありますか?

19
PR102012

Spark> = 2.2

from pyspark.sql.functions import to_timestamp

(sc
    .parallelize([Row(dt='2016_08_21 11_31_08')])
    .toDF()
    .withColumn("parsed", to_timestamp("dt", "yyyy_MM_dd hh_mm_ss"))
    .show(1, False))

## +-------------------+-------------------+
## |dt                 |parsed             |
## +-------------------+-------------------+
## |2016_08_21 11_31_08|2016-08-21 11:31:08|
## +-------------------+-------------------+

スパーク<2.2

unix_timestamp 扱うことができません:

from pyspark.sql import Row
from pyspark.sql.functions import unix_timestamp

(sc
    .parallelize([Row(dt='2016_08_21 11_31_08')])
    .toDF()
    .withColumn("parsed", unix_timestamp("dt", "yyyy_MM_dd hh_mm_ss")
    .cast("double")
    .cast("timestamp"))
    .show(1, False))

## +-------------------+---------------------+
## |dt                 |parsed               |
## +-------------------+---------------------+
## |2016_08_21 11_31_08|2016-08-21 11:31:08.0|
## +-------------------+---------------------+

どちらの場合も、フォーマット文字列はJava SimpleDateFormat と互換性があります。

39
zero323

zero323の答えは質問に答えますが、日付時刻文字列が標準形式を持っている場合、タイムスタンプタイプに直接キャストできることを追加したかったです。

df.withColumn('datetime', col('datetime_str').cast('timestamp'))

ミリ秒を処理するという利点がありますが、unix_timestampは秒精度(to_timestampはミリ秒でも動作しますが、Spark> = zero323が述べられているように2.2)が必要です。私はSpark= 2.3 .0、次の形式を使用: '2016-07-13 14:33:53.979'(ミリ秒ありますが、それらがなくても機能します)。

6
Florent F

私は選択した答えに完全に同意しますが、「2019_01_27 16_00_00」などのタイムスタンプに関する問題を回避するために、フォーマットを「yyyy_MM_dd HH_mm_ss」に設定したいと思います-> Note hour> 12

0
Pedro Muñoz