2017-09-20 11 views
0

私はcsvファイルからカスタム形式で時刻を読み取る方法は?

私はそれと感じ

Exception in task 0.0 in stage 0.0 (TID 0) 
java.lang.IllegalArgumentException 
    at java.sql.Date.valueOf(Unknown Source) 
    at org.apache.spark.sql.catalyst.util.DateTimeUtils$.stringToTime(DateTimeUtils.scala:137) 

としてエラーの下に生産

StructType schema = DataTypes.createStructType(Arrays.asList(
       DataTypes.createStructField("Date", DataTypes.DateType, false), 
       DataTypes.createStructField("Time", DataTypes.TimestampType, false), 
       DataTypes.createStructField("CO(GT)", DataTypes.IntegerType, false), 
       DataTypes.createStructField("PT08.S1(CO)", DataTypes.IntegerType, false))) 

Dataset<Row> df = spark.read().format("csv").schema(schema).load("src/main/resources/AirQualityUCI/sample.csv"); 

その次のようにスキーマを作成し、ファイルを読んでいます

2016-10-03, 18.00.00, 2, 6 

としてデータを持つCSVファイルを解析しています時間形式エラーによるものです。適切な意味でStructTypeにするために、それらを特定の形式または変更に変換する方法は何ですか?

私が期待しているフォーマットは、spark sqlで列を連結してタイムスタンプ形式に変換すると便利なので、hh:mm:ssという形式です。

2016-10-03, 18:00:00, 2, 6 
+0

重複のhttps://stackoverflow.com/questions/46295879/how-to-read-date-in-custom-format-from-csv-file –

+0

@RameshMaharjan時間形式です。 stackoverflowごとに、我々は1つで複数の質問をすることはできませんので、別の質問を投稿しました。 –

+0

@UtkarshSaraf csvファイルを読むときに 'option(" timestampFormat "、" HH.mm.ss ")'を使います。詳細については、Rameshが投稿したリンクを確認してください。 – Shaido

答えて

1

日付と時刻の両方を文字列として読み取ると、簡単にマージしてタイムスタンプに変換できます。あなたは ""を変更する必要はありません。 Timestampの作成時にフォーマットとしてTimeカラムの ":"に指定することができます。 Scalaの溶液の例:

val df = Seq(("2016-10-03", "00.00.17"),("2016-10-04", "00.01.17")) 
    .toDF("Date", "Time") 

val df2 = df.withColumn("DateTime", concat($"Date", lit(" "), $"Time")) 
    .withColumn("Timestamp", unix_timestamp($"DateTime", "yyyy-MM-dd HH.mm.ss")) 

あなたを与えるだろう。もちろん

+----------+--------+-------------------+----------+ 
|  Date| Time|   DateTime| Timestamp| 
+----------+--------+-------------------+----------+ 
|2016-10-03|00.00.17|2016-10-03 00.00.17|1475424017| 
|2016-10-04|00.01.17|2016-10-04 00.01.17|1475510477| 
+----------+--------+-------------------+----------+ 

を、あなたがしたい場合、あなたはまだ使用する時間]列に変換することができます「:」の代わりに「」。それはregexp_replaceを使用して行うことができます。

df.withColumn("Time2", regexp_replace($"Time", "\\.", ":")) 

あなたはタイムスタンプに変換する前にこれを行う場合は、上記の指定された形式を変更する必要があります。

関連する問題