CSVがSparkのデータフレームとして読み取られる場合、すべての列が文字列として読み取られます。列の実際のタイプを取得する方法はありますか?
次の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
すべての列は文字列として読み取られます。列years_of_experienceがintおよび[〜#〜] dob [〜 #〜]はdateとして読み取られます
オプションinferSchemaをtrueに設定したことに注意してください。
Spark-csvパッケージの最新バージョン(1.0.3)を使用しています
ここで何か不足していますか?
2015-07-30
最新バージョンは実際には 1.1. ですが、inferSchema
最新リリースには含まれていません のように見えるため、特に問題ではありません。
2015-08-17
パッケージの最新バージョンは 1.2. (2015-08-06に公開)になり、スキーマ推論は期待どおりに機能します。
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