2016-11-28 15 views
2

Sparkで.csvファイルを読み込み、フィッティングタイプに列を関連づけたいと思います。(Scala)Apache Sparkの文字列を日付に変換する

val conf = new SparkConf() 
     .setMaster("local[8]") 
     .setAppName("Name") 

    val sc = new SparkContext(conf) 

    val sqlContext = new SQLContext(sc) 

    val customSchema = StructType(Array(
     StructField("date", DateType, true), 
     StructField("time",StringType, true), 
     StructField("am", DoubleType, true), 
     StructField("hum", DoubleType, true), 
     StructField("temp", DoubleType, true) 
    )) 

    val df = sqlContext.read 
      .format("org.apache.spark.sql.execution.datasources.csv.CSVFileFormat") 
      .option("header","true") 
      .option("delimiter",";") 
      .schema(customSchema) 
      .load("data.csv") 

.CSVのラインは私が.CSVを読んで、私は文字列に日付のタイプを設定している場合、正しくタイプを関連付けます。この

+----------+--------+-----+-----+-----+ 
|  date| time| am| hum| temp| 
+----------+--------+-----+-----+-----+ 
|04.10.2016|12:51:20|1.121|0.149|0.462| 
+----------+--------+-----+-----+-----+ 

スパークのようなルックスを読んでいます。上記のコードのようにcustomSchemaを保持すると、間違った日付形式のためSparkが例外をスローする(DateType will expect YYYY-MM-DD while mine is DD.MM.YYYY).

日付文字列をYYYY-MM-DDにフォーマットし直してから後でスキーマを適用する方法はありますか?または、パラメータを追加してSparkによって与えられたDateTypeも変更できますか?事前

答えて

4

使用中の

おかげdateFormatオプション:

val df = sqlContext.read 
    .format("org.apache.spark.sql.execution.datasources.csv.CSVFileFormat") 
    .option("header","true") 
    .option("delimiter",";") 
    .option("dateFormat", "dd.MM.yyyy") 
    .schema(customSchema) 
    .load("data.csv") 
+0

ありがとうございました。 DataFrameReaderの利用可能なオプションのリストがあるかどうか教えてください。私はまだ1つを見つけることができませんでした。 –

+0

https://github.com/databricks/spark-csv#features –

0

私は後で日付を解析お勧めします。 thisも参照してください。

val df = Seq((1L, "05/26/2016 01:01:01"), (2L, "#[email protected]#@#")).toDF("id", "dts") 
import org.apache.spark.sql.functions.unix_timestamp 

val ts = unix_timestamp($"dts", "MM/dd/yyyy HH:mm:ss").cast("timestamp") 

df.withColumn("ts", ts).show(2, false) 
// +---+-------------------+---------------------+ 
// |id |dts    |ts     | 
// +---+-------------------+---------------------+ 
// |1 |05/26/2016 01:01:01|2016-05-26 01:01:01.0| 
// |2 |#[email protected]#@#    |null     | 
// +---+-------------------+---------------------+ 

と:また

scala> date.format(DateTimeFormatter.ofPattern("yyyy.MM.dd")) 
res0: String = 2020.01.01 

サイドノートとして、(代わりSCの、sqlcontextなど)スパーク2.0ので、あなただけのスパーク・セッション・オブジェクトを使用して、スキーマを推測するためのエンコーダを使用します。このようなもの:

関連する問題