Sparkでunixのタイムスタンプを日付に変換する方法

Unixタイムスタンプ(例:1435655706000)のカラムを持つデータフレームがあり、 'yyyy-MM-DD' のフォーマットでデータに変換したいのですが、 nscala-timeを試しましたがうまくいきません。

val time_col = sqlc.sql("select ts from mr").map(_(0).toString.toDateTime)
time_col.collect().foreach(println)

で、エラーが出ました。 java.lang.IllegalArgumentException:Invalid format: "1435655706000"は"6000&quotで不正なフォーマットです。

質問へのコメント (2)

spark1.5以降、それを行うための組み込みUDFがあります。

val df = sqlContext.sql("select from_unixtime(ts,'YYYY-MM-dd') as `ts` from mr")

詳細については、Spark 1.5.2 API Docを確認してください。

解説 (3)

ここでは、Scala DataFrame関数を使用しています:from_unixtimeおよびto_date

// NOTE: divide by 1000 required if milliseconds
// e.g. 1446846655609 -> 2015-11-06 21:50:55 -> 2015-11-06 
mr.select(to_date(from_unixtime($"ts" / 1000))) 

解説 (1)
import org.joda.time.{DateTimeZone}
import org.joda.time.format.DateTimeFormat

以下のライブラリのインポートが必要です。

val stri = new DateTime(timeInMillisec).toDateTime.toString("yyyy/MM/dd")

または、あなたのケースに合わせて:

 val time_col = sqlContext.sql("select ts from mr")
                     .map(line => new DateTime(line(0).toInt).toDateTime.toString("yyyy/MM/dd"))

他の方法があるかもしれません.

  import com.github.nscala_time.time.Imports._

  val date = (new DateTime() + ((threshold.toDouble)/1000).toInt.seconds )
             .toString("yyyy/MM/dd")

これが役に立つといいのですが :)

解説 (0)

nscala_time で toDataTime を適用する前に String に変換する必要はない。

import com.github.nscala_time.time.Imports._ とする.

scala> 1435655706000L.toDateTime
res4: org.joda.time.DateTime = 2015-06-30T09:15:06.000Z

`

解説 (0)

私は、joda-time ライブラリを使用して、DataFrameにマッピングし、DateTimeをStringに変換することによって、この問題を解決しました。

import org.joda.time._
val time_col = sqlContext.sql("select ts from mr")
                         .map(line => new DateTime(line(0)).toString("yyyy-MM-dd"))
解説 (0)

あなたができることは:

input.withColumn("time", concat(from_unixtime(input.col("COL_WITH_UNIX_TIME")/1000,
"yyyy-MM-dd'T'HH:mm:ss"), typedLit("."), substring(input.col("COL_WITH_UNIX_TIME"), 11, 3), 
typedLit("Z")))

ここで、時間は新しい列名であり、COL_WITH_UNIX_TIMEは変換する列の名前です。 これにより、ミリ単位でデータが表示され、データがより正確になります。たとえば、「yyyy-MM-dd'T'HH:mm:ss.SSS'Z」」などです。

解説 (0)

Javaでは次の構文を使用できます。

input.select("timestamp)
            .withColumn("date", date_format(col("timestamp").$div(1000).cast(DataTypes.TimestampType), "yyyyMMdd").cast(DataTypes.IntegerType))
解説 (0)