PySparkデータフレームに次の形式の日付を持つ列date
があります。
2018-02-01T13:13:12.023507
その列の日付を文字列からタイムスタンプ(または日付に基づいて並べ替えることができるもの)に変換したいと思います。これまで私は以下を試しました:
new_df = df.withColumn(
'date',
unix_timestamp("date", "YYYY-MM-DD'T'hh:mm:ss.s").cast("double").cast("timestamp")
)
この
new_df = df.withColumn(
'date',
from_unixtime(
unix_timestamp(col(('date')), "yyyy-MM-dd'T'hh:mm:ss.SSS"),
"yyyy-MM-dd'T'HH:mm:ss.SSS"
)
)
この
df_new = df.withColumn(
'date1',
F.to_timestamp("date", "yyyy-dd-MM'T'hh:mm:ss.s")
)
他の同様の質問で見つけたすべてを試しましたが、これまでのところ何も機能していません。別の形式も試しましたyyyy-MM-dd'T'HH:mm:ss.ssssss
成功しませんでした。何が足りないのですか?
次のDataFrameがあるとします。
df = spark.createDataFrame(
[('2018-02-01T13:13:12.023507', ), ('2018-02-01T13:13:12.323507', )],
["date"]
)
df.show(truncate=False)
#+--------------------------+
#|date |
#+--------------------------+
#|2018-02-01T13:13:12.023507|
#|2018-02-01T13:13:12.323507|
#+--------------------------+
unixtimestamp
は2番目の精度のみをサポートします 。日付に基づく並べ替えのみを行う場合は、次の操作を実行できます。
from pyspark.sql.functions import col, unix_timestamp
df.withColumn(
'new_date',
unix_timestamp(col('date'), "yyyy-MM-dd'T'hh:mm:ss").cast("timestamp")
).sort('new_date').show(truncate=False)
#+--------------------------+---------------------+
#|date |new_date |
#+--------------------------+---------------------+
#|2018-02-01T13:13:12.323507|2018-02-01 13:13:12.0|
#|2018-02-01T13:13:12.023507|2018-02-01 13:13:12.0|
#+--------------------------+---------------------+
ただし、これら2つの例の行は、秒まで同じ日時であるため、ここでの並べ替えは不確定になります。
1秒未満の部分が重要な場合は、それを処理する独自の関数を作成できます。 1つの方法は、.
のdate
列を分割し、1000000.0
で除算してマイクロ秒を取得することです。次に、これをunixtimestamp
に追加して並べ替えます。
from pyspark.sql.functions import split
df.withColumn(
'order_column',
unix_timestamp('date', "yyyy-MM-dd'T'hh:mm:ss") + split('date', "\.")[1]/1000000.0
).sort("order_column").show(truncate=False)
#+--------------------------+-------------------+
#|date |order_column |
#+--------------------------+-------------------+
#|2018-02-01T13:13:12.023507|1.517508792023507E9|
#|2018-02-01T13:13:12.323507|1.517508792323507E9|
#+--------------------------+-------------------+
以下のようにudfを試すことができます。
format = '%Y-%m-%d %H:%M:%S:%s' func = udf (lambda x: datetime.strptime(x, format), TimestampType())
for Spark> = 2.2 unix_timestamp()
の代替アプローチは、to_timestamp()
を使用することです。
from pyspark.sql.functions import col, to_timestamp
new_df = df.withColumn('converted_date',to_timestamp(col('date'), "yyyy-MM-dd'T'HH:mm:ss"))