web-dev-qa-db-ja.com

Spark文字列で現在の日付を取得する

私はSparkとDatabricksに比較的慣れていません。以下のコードを使用して、日付を適切な形式で取得し、ファイル名文字列に追加できるようにします。

%scala

// Getting the date for the file name
import org.Apache.spark.sql.functions.{current_timestamp, date_format}
val dateFormat = "yyyyMMdd_HHmm"
val dateValue = spark.range(1).select(date_format(current_timestamp,dateFormat)).collectAsList().get(0).get(0)

val fileName = "TestFile_" + dateValue+ ".csv"

これは手間がかかりにくいと思いますが、現在の日付を文字列に単純に取得する簡単な方法はありますか?

2
Sauron

Date_formatの後で、それを匿名データセットに変換し、最初の関数を使用してそれを文字列変数に変換できます。これをチェックしてください

scala> val dateFormat = "yyyyMMdd_HHmm"
dateFormat: String = yyyyMMdd_HHmm

scala> val dateValue = spark.range(1).select(date_format(current_timestamp,dateFormat)).as[(String)].first
dateValue: String = 20190320_2341

scala> val fileName = "TestFile_" + dateValue+ ".csv"
fileName: String = TestFile_20190320_2341.csv

scala>

Dfを作成せずに、expr()を使用して結果を取得できます。

scala> val ts = (current_timestamp()).expr.eval().toString.toLong
ts: Long = 1553106289387000

scala> new Java.sql.Timestamp(ts/1000)
res74: Java.sql.Timestamp = 2019-03-20 23:54:49.387

上記は通常のscalaで結果を与えるので、日付/時刻ライブラリを使用してフォーマットできます

EDIT1:

これがもう1つの方法で、通常のscalaでフォーマットします。

scala> val dateFormat = "yyyyMMdd_HHmm"
dateFormat: String = yyyyMMdd_HHmm

scala> val ts = (current_timestamp()).expr.eval().toString.toLong
ts: Long = 1553108012089000

scala> val dateValue = new Java.sql.Timestamp(ts/1000).toLocalDateTime.format(Java.time.format.DateTimeFormatter.ofPattern(dateFormat))
dateValue: String = 20190321_0023

scala> val fileName = "TestFile_" + dateValue+ ".csv"
fileName: String = TestFile_20190321_0023.csv

scala>

pysparkを使用する

>>> dateFormat = "%Y%m%d_%H%M"
>>> import datetime
>>> ts=spark.sql(""" select current_timestamp() as ctime """).collect()[0]["ctime"]
>>> ts.strftime(dateFormat)
'20190328_1332'
>>> "TestFile_" +ts.strftime(dateFormat) + ".csv"
'TestFile_20190328_1332.csv'
>>>
5
stack0114106