簡體   English   中英

PySpark 數據幀將異常字符串格式轉換為時間戳

[英]PySpark dataframe convert unusual string format to Timestamp

我通過 Spark 1.5.0 使用 PySpark。 我在日期時間值的列的行中有一個不尋常的字符串格式。 它看起來像這樣:

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

有沒有辦法將這種非正統的yyyy_mm_dd hh_mm_dd格式轉換為時間戳? 最終可以實現的東西

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

我原以為像星火SQL函數regexp_replace可以工作,但我當然需要更換_-在日期一半_:在時間的一部分。

我想我可以使用substring將列拆分為 2 並從時間結束向后計數。 然后分別執行'regexp_replace',然后連接。 但這似乎操作很多? 有沒有更簡單的方法?

火花 >= 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")
    # For Spark <= 1.5
    # See issues.apache.org/jira/browse/SPARK-11724 
    .cast("double")
    .cast("timestamp"))
    .show(1, False))

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

在這兩種情況下,格式字符串都應該與 Java SimpleDateFormat兼容。

zero323 的回答回答了這個問題,但我想補充一點,如果您的日期時間字符串具有標准格式,您應該能夠將其直接轉換為時間戳類型:

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

它具有處理毫秒的優勢,而unix_timestamp只有秒精度( to_timestamp 也適用於毫秒,但要求 Spark >= 2.2 如 zero323 所述)。 我在 Spark 2.3.0 上測試了它,使用以下格式:'2016-07-13 14:33:53.979'(以毫秒為單位,但沒有它們也能工作)。

我完全同意所選的答案,但是我想將格式設置為 'yyyy_MM_dd HH_mm_ss' 以避免出現諸如 '2019_01_27 16_00_00' -> Note hours > 12 這樣的時間戳問題

我從Florent F 的回答中添加了更多代碼行,以便更好地理解和在本地機器上運行代碼段:

import os, pdb, sys
import pyspark
from pyspark.sql import SparkSession
from pyspark.sql import Row
from pyspark.sql.types import StructType, ArrayType  
from pyspark.sql.types import StringType
from pyspark.sql.functions import col

sc = pyspark.SparkContext('local[*]')
spark = SparkSession.builder.getOrCreate()

# preparing some example data - df1 with String type and df2 with Timestamp type
df1 = sc.parallelize([{"key":"a", "date":"2016-02-01"}, 
    {"key":"b", "date":"2016-02-02"}]).toDF()
df1.show()

df2 = df1.withColumn('datetime', col('date').cast("timestamp"))
df2.show()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM