13

Spark で CSV をデータフレームとして読み取ると、すべての列が文字列として読み取られます。列の実際のタイプを取得する方法はありますか?

次のcsvファイルがあります

Name,Department,years_of_experience,DOB
Sam,Software,5,1990-10-10
Alex,Data Analytics,3,1992-10-10

以下のコードを使用してCSVを読みました

val df = sqlContext.
                  read.
                  format("com.databricks.spark.csv").
                  option("header", "true").
                  option("inferSchema", "true").
                  load(sampleAdDataS3Location)
df.schema

すべての列が文字列として読み取られます。列year_of_experienceはintとして読み取られ、DOBはdateとして読み取られることを期待しています

オプションinferSchematrueに設定したことに注意してください。

spark-csv パッケージの最新バージョン (1.0.3) を使用しています

ここで何か不足していますか?

4

1 に答える 1

15

2015-07-30

最新バージョンは実際には1.1.0ですがinferSchema 、最新のリリースには含まれていないように見えるので問題ありません。

2015-08-17

パッケージの最新バージョンは現在1.2.0 (2015 年 8 月 6 日に公開) であり、スキーマの推論は期待どおりに機能します。

scala> df.printSchema
root
 |-- Name: string (nullable = true)
 |-- Department: string (nullable = true)
 |-- years_of_experience: integer (nullable = true)
 |-- DOB: string (nullable = true)

自動日付解析に関しては、少なくとも追加のメタデータを提供しない限り、それが起こるとは思えません。

すべてのフィールドが日付のような形式に従っている場合でも、特定のフィールドを日付として解釈する必要があるかどうかを判断することはできません。したがって、自動日付推論の欠如か、混乱のようなスプレッドシートのいずれかです。たとえば、タイムゾーンの問題は言うまでもありません。

最後に、日付文字列を手動で簡単に解析できます。

sqlContext
  .sql("SELECT *, DATE(dob) as dob_d  FROM df")
  .drop("DOB")
  .printSchema

root
 |-- Name: string (nullable = true)
 |-- Department: string (nullable = true)
 |-- years_of_experience: integer (nullable = true)
 |-- dob_d: date (nullable = true)

したがって、それは実際には深刻な問題ではありません。

2017-12-20 :

Spark 2.0 が日付とタイムスタンプのスキーマ推論をサポートするため、組み込みの csv パーサーが利用可能になりました。2 つのオプションを使用します。

  • timestampFormatデフォルトでyyyy-MM-dd'T'HH:mm:ss.SSSXXX
  • dateFormatデフォルトでyyyy-MM-dd

CSV の inferSchema を強制的に整数を日付と見なす方法 (「dateFormat」オプションを使用)も参照してください。

于 2015-07-30T14:06:48.333 に答える