[Apache Spark SQL]日付時刻関数(Date time functions)

日付時刻関数(Date time functions)

add_months

def add_months(startDate: Column, numMonths: Int)Column

startDateにnumMonthsを加えた日付を返す。
例えば、startDate = “2021-01-01”, numMonths = 3の場合、”2021-04-01″を返す。

  • startDate
    データ型は、date, timestamp,stringのいずれか。
    string型の場合は、date型にキャストできるフォーマット(yyyy-MM-dd or yyyy-MM-dd HH:mm:ss.SSSS)でなければならない。
  • numMonths
    startDateに加えたい月数。マイナスの値なら減算となる。
  • 返り値
    日付を返す(date型)。startDateがstring型でdate型にキャストできない場合はnullを返す。
  • ver 1.5.0から
コード例

%spark
val df = Seq(("2021-01-01")).toDF("date")
.withColumn("date", to_date(col("date")))
.withColumn("date1", add_months(col("date"), -3))
.withColumn("date2", add_months(col("date"), 3))
df.show()
df.printSchema
アウトプット

+----------+----------+----------+
|      date|     date1|     date2|
+----------+----------+----------+
|2021-01-01|2020-10-01|2021-04-01|
+----------+----------+----------+

root
 |-- date: string (nullable = true)
 |-- date1: date (nullable = true)
 |-- date2: date (nullable = true)

current_date

def current_date(): Column

現在の日付を返す。

  • ver 1.5.0から
コード例

%spark
val df = Seq(("2021-01-01")).toDF("date")
.withColumn("current_date", current_date())

df.show()
df.printSchema
アウトプット

+----------+------------+
|      date|current_date|
+----------+------------+
|2021-01-01|  2021-06-27|
+----------+------------+

root
 |-- date: string (nullable = true)
 |-- current_date: date (nullable = false)

current_timestamp

def current_timestamp(): Column

現在のタイムスタンプを返す。

  • ver 1.5.0から
コード例

%spark
val df = Seq(("2021-01-01")).toDF("date")
.withColumn("current_timestamp", current_timestamp())

df.show()
df.printSchema
アウトプット

+----------+-----------------------+
|      date|   current_timestamp   |
+----------+-----------------------+
|2021-01-01|2021-06-27 13:48:43.085|
+----------+-----------------------+

root
 |-- date: string (nullable = true)
 |-- current_timestamp: timestamp (nullable = false)

date_add

def date_add(start: Column, days: Int): Column

startにdaysを加えた日付を返す。
例えば、start = “2021-01-01”, days = 3の場合、”2021-01-04″を返す。

  • start
    データ型は、date, timestamp,stringのいずれか。
    string型の場合は、date型にキャストできるフォーマット(yyyy-MM-dd or yyyy-MM-dd HH:mm:ss.SSSS)でなければならない。
  • days
    startに加える日数。マイナスの値なら減算となる。
  • returns
    日付を返す(date型)。startがstring型でdate型にキャストできない場合はnullを返す。
  • Since
    ver 1.5.0から
コード

%spark
val df = Seq(("2021-01-01")).toDF("date")
.withColumn("date1", date_add(col("date"), 3))
.withColumn("date2", date_add(col("date"), -3))

df.show()
df.printSchema
アウトプット

+----------+----------+----------+
|      date|     date1|     date2|
+----------+----------+----------+
|2021-01-01|2021-01-04|2020-12-29|
+----------+----------+----------+

root
 |-- date: string (nullable = true)
 |-- date1: date (nullable = true)
 |-- date2: date (nullable = true)

date_format

def date_format(dateExpr: Column, format: String): Column

データ型date, timestamp, stringから、第二引数で指定したdateフォーマットのstring型の値に変換する。

  • dateExpr
    データ型は、date, timestamp,stringのいずれか。
    string型の場合は、date型にキャストできるフォーマットパターン(yyyy-MM-dd or yyyy-MM-dd HH:mm:ss.SSSS)でなければならない。
  • format
    例えば、フォーマットパターンが、dd.MM.yyyyの場合、string型で 28.06.2021と返す。
  • returns
    string型を返す(date型)。dateExprがtimestampにキャストできないstring型の場合はnullを返す。
  • Since
    ver 1.5.0から
  • Exceptions thrown
    フォーマットパターンが無効の場合は、IllegalArgumentException
コード例

%spark
val df = Seq(("2021-01-01")).toDF("date")
.withColumn("date1", date_format(col("date"), "dd/MM/yyyy HH:mm:ss"))
df.show()
df.printSchema
アウトプット

+----------+-------------------+
|      date|              date1|
+----------+-------------------+
|2021-01-01|01/01/2021 00:00:00|
+----------+-------------------+

root
 |-- date: string (nullable = true)
 |-- date1: string (nullable = true)

date_sub

def date_sub(start: Column, days: Int): Column

startからdaysを引いた日付を返す。
例えば、start = “2021-01-01”, days = 3の場合、”2020-12-29″を返す。

  • start
    データ型は、date, timestamp,stringのいずれか。
    string型の場合は、date型にキャストできるフォーマット(yyyy-MM-dd or yyyy-MM-dd HH:mm:ss.SSSS)でなければならない。
  • days
    startから引く日数。マイナスの値なら加算となる。
  • returns
    日付を返す(date型)。startがstring型でdate型にキャストできない場合はnullを返す。
  • Since
    ver 1.5.0から
コード例

%spark
val df = Seq(("2021-01-01")).toDF("date")
.withColumn("date1", date_sub(col("date"), 3))

df.show()
df.printSchema
アウトプット

+----------+----------+
|      date|     date1|
+----------+----------+
|2021-01-01|2020-12-29|
+----------+----------+

root
 |-- date: string (nullable = true)
 |-- date1: date (nullable = true)

datediff

def datediff(start: Column, days: Int): Column

startからendまでの日数を返す。
例えば、start = “2021-01-01”, end = “2021-01-31“の場合、”30″を返す。

  • end
    データ型は、date, timestamp,stringのいずれか。
    string型の場合は、date型にキャストできるフォーマット(yyyy-MM-dd or yyyy-MM-dd HH:mm:ss.SSSS)でなければならない。
  • start
    データ型は、date, timestamp,stringのいずれか。
    string型の場合は、date型にキャストできるフォーマット(yyyy-MM-dd or yyyy-MM-dd HH:mm:ss.SSSS)でなければならない。
  • returns
    日数を返す(integer型)。startかendがstring型でdate型にキャストできない場合はnullを返す。
    endがstartより前の場合は、マイナスの値を返す。
  • Since
    ver 1.5.0から

コード例

%spark
val df = Seq(("2021-01-01","2021-01-31")).toDF("start_date","end_date")
.withColumn("datediff",datediff(col("end_date"),col("start_date")))
df.show()
df.printSchema

アウトプット

+----------+----------+--------+
|start_date|  end_date|datediff|
+----------+----------+--------+
|2021-01-01|2021-01-31|      30|
+----------+----------+--------+

root
 |-- start_date: string (nullable = true)
 |-- end_date: string (nullable = true)
 |-- datediff: integer (nullable = true)

date_trunc

def date_trunc(format: String, timestamp: Column): Column

formatで指定された単位で切り捨てられたtimestampを返す。
例えば、date_trunc("year", "2018-11-19 12:01:19") は、「2018-01-01 00:00:00」を返す。

  • timestamp
    データ型は、date, timestamp,stringのいずれか。
    string型の場合は、date型にキャストできるフォーマット(yyyy-MM-dd or yyyy-MM-dd HH:mm:ss.SSSS)でなければならない。
  • returns
    timestamp型を返す。startがstring型でtimestamp型にキャストできない場合、または、有効でないformatの場合はnullを返す。
  • Since
    ver 2.3.0から

コード例

%spark
val df = Seq(("2021-05-10 22:22:22")).toDF("date")
.withColumn("date", to_timestamp(col("date")))
.withColumn("date1", date_trunc("year", col("date")))
.withColumn("date2", date_trunc("month", col("date")))
.withColumn("date3", date_trunc("day", col("date")))
.withColumn("date4", date_trunc("hour", col("date")))
.withColumn("date5", date_trunc("minute", col("date")))
.withColumn("date6", date_trunc("second", col("date")))

df.show()

アウトプット

+-------------------+-------------------+-------------------+-------------------+-------------------+-------------------+-------------------+
|               date|              date1|              date2|              date3|              date4|              date5|              date6|
+-------------------+-------------------+-------------------+-------------------+-------------------+-------------------+-------------------+
|2021-05-10 22:22:22|2021-01-01 00:00:00|2021-05-01 00:00:00|2021-05-10 00:00:00|2021-05-10 22:00:00|2021-05-10 22:22:00|2021-05-10 22:22:22|
+-------------------+-------------------+-------------------+-------------------+-------------------+-------------------+-------------------+

dayofmonth

def dayofmonth(e: Column): Column

date/timestamp/string型から、日付をinteger型で抽出する。
例えば、dayofmonth(col(“2021-05-01”))の場合は、1を返す。

  • returns
    integer型を返す。inputがstring型でdate型にキャストできない場合はnullを返す。
  • Since
    ver 1.5.0から

コード例

%spark
val df = Seq(("2021-05-01")).toDF("date")
.withColumn("dayofmonth",dayofmonth(col("date")))

df.show()
df.printSchema

アウトプット

+----------+----------+
|      date|dayofmonth|
+----------+----------+
|2021-05-01|         1|
+----------+----------+

root
 |-- date: string (nullable = true)
 |-- dayofmonth: integer (nullable = true)

dayofweek

def dayofweek(e: Column): Column

date/timestamp/string型から、曜日をinteger型で抽出する。

  • 1 -> 日曜日
  • 2 -> 月曜日
  • 3 -> 火曜日
  • 4 -> 水曜日
  • 5 -> 木曜日
  • 6 -> 金曜日
  • 7 -> 土曜日

例えば、dayofweek(col(“2021-06-19”))の場合は、7(土曜日)を返す。

  • returns
    integer型を返す。inputがstring型でdate型にキャストできない場合はnullを返す。
  • Since
    ver 2.3.0から

dayofyear

def dayofyear(e: Column): Column

date/timestamp/string型から、日数をinteger型で抽出する。

  • returns
    integer型を返す。inputがstring型でdate型にキャストできない場合はnullを返す。
  • Since
    ver 1.5.0から

コード例

%spark
val df = Seq(("2021-05-10")).toDF("date")
.withColumn("dayofyear",dayofyear(col("date")))

df.show()
df.printSchema

アウトプット

+----------+---------+
|      date|dayofyear|
+----------+---------+
|2021-05-10|      130|
+----------+---------+

root
 |-- date: string (nullable = true)
 |-- dayofyear: integer (nullable = true)

from_unixtime

def from_unixtime(ut: Column, f: String): Column

unix時間(unix epoch : 1970-01-01 00:00:00 UTCからの経過秒数)を、timestampを表すStringに変換する。第二引数でフォーマットを指定できる。第二引数を指定しない場合は、yyyy-MM-dd HH:mm:ss のフォーマットになる。

  • ut
    string/integer型(long型にキャスト可能な数字)。unix epochより前のtimestampは表すにはマイナスを指定する。
  • f
    date timeのフォーマットパターン。
  • returns
    string型を返す。utがstring型でlong型にキャストできない場合、またはf が有効ではない場合はnullを返す。

コード例

%spark
val df = Seq(("999787346")).toDF("unixtime")
.withColumn("date",from_unixtime(col("unixtime"), "yyyy/MM/ss HH:mm:ss"))
.withColumn("date1",from_unixtime(col("unixtime")))

df.show()
df.printSchema

アウトプット

+---------+-------------------+-------------------+
| unixtime|               date|              date1|
+---------+-------------------+-------------------+
|999787346|2001/09/26 23:42:26|2001-09-06 23:42:26|
+---------+-------------------+-------------------+

root
 |-- unixtime: string (nullable = true)
 |-- date: string (nullable = true)
 |-- date1: string (nullable = true)

from_utc_timestamp

def from_utc_timestamp(ts: Column, tz: String): Column

“2021-01-01 02:40:00.0″のtimestampをUTC(協定世界時)と解釈し、第二引数に指定したtz(タイムゾーン)に変換して返します。例えば、”GMT+1″なら”2021-01-01 03:40:00.0″を返します。

  • ts
    データ型は、date, timestamp,stringのいずれか。
    string型の場合は、date型にキャストできるフォーマット(yyyy-MM-dd or yyyy-MM-dd HH:mm:ss.SSSS)でなければならない。
  • tz
    string型。formatは以下であるべき(参考URL)。
    • region-based zone IDs (area/city)
      America/Los_Angeles
    • zone offsets
      GMT+9
  • returns
    timestamp型を返す。tsがstring型でtimestamp型にキャストできない場合、またはtz が有効ではない場合はnullを返す。
  • Since
    ver 1.5.0から
コード例

%spark
val df = Seq(("2021-01-01 02:40:00.0")).toDF("time")
.withColumn("time1",from_utc_timestamp(col("time"), "GMT+9"))
.withColumn("time2",from_utc_timestamp(col("time"), "America/Los_Angeles"))

df.show()
df.printSchema
アウトプット

+--------------------+-------------------+-------------------+
|                time|              time1|              time2|
+--------------------+-------------------+-------------------+
|2021-01-01 02:40:...|2021-01-01 11:40:00|2020-12-31 18:40:00|
+--------------------+-------------------+-------------------+

root
 |-- time: string (nullable = true)
 |-- time1: timestamp (nullable = true)
 |-- time2: timestamp (nullable = true)

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です