2017-09-19 12 views
2

私は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").option("Date", "dd-MM-yyyy").schema(schema).load("src/main/resources/AirQualityUCI/sample.csv"); 

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

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

としてデータを持つCSVファイルを解析しています日付形式のエラーが原因です。それらを特定の形式に変換する方法は何ですか?

+2

_「CSVファイルを読み込んでいます」_ファイルをどのように読んでいますか? –

+0

'DataTypes.TimestampType'には日付フィールドもあるはずです。 –

+0

@JacekLaskowski parsing :) –

答えて

3

使用次のようにCSVファイル(複数可)を読んdateFormatオプション:dateFormatため

val csvs = spark. 
    read. 
    format("csv"). 
    option("dateFormat", "dd-MM-yyyy"). // <-- should match 03-10-2016 
    load(...) 

デフォルトはyyyy-MM-ddあるので、それはあなたが解析エラーを持っている何の驚きではありません。 valueOfののJavadocから引用


IllegalArgumentExceptionをスロー - 指定された日付がJDBC日付エスケープ形式でない場合(YYYY-[M] M- [D] D)

これは、valueOfのパーサーでは値が正しくないことを意味します。

私はここ2件の勧告を持っていると思います:

  1. はあなたが内部の持っているものを見るためにデータセットとshowそれをお読みください。

  2. ために適切なフォーマットを定義するためのdateFormatオプション(それがデフォルトでyyyy-MM-ddです)

java.text.SimpleDateFormatの)Date and Time Patternsにおけるフォーマットパターンについての詳細を検索します。

+0

マップ関数を使用して、ここでcsvデータを解析する際にstringで 'dataFormat'を使用し、それを必要な形式に変換してからデータセットを作成できますか?ちょっと興味があるんだけど。 –

+1

スパークがあなたのためにできることはできますが、できません。 –

+1

確かです。私はあなたの大ファンであり、 "Mastering Spark"という名の貴重なノートを読んでいます。彼らはそれを学ぶのに非常に役立ちます:) –

関連する問題