web-dev-qa-db-ja.com

spark-csvパッケージのinferSchema

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_experienceintおよび[〜#〜] dob [〜 #〜]dateとして読み取られます

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

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

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

9
sag

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

参照 CSVのinferSchemaで整数を日付と見なす方法( "dateFormat"オプションを使用)

11
zero323