web-dev-qa-db-fra.com

inferSchema dans le paquet spark-csv

Lorsque CSV est lu en tant que trame de données dans spark, toutes les colonnes sont lues en tant que chaîne. Existe-t-il un moyen d'obtenir le type réel de colonne?

J'ai le fichier csv suivant

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

J'ai lu le CSV en utilisant le code ci-dessous

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

Toutes les colonnes sont lues comme une chaîne. Je m'attends à ce que la colonne years_of_experience soit lue comme int et DOB soit lue comme date

Veuillez noter que j'ai défini l'option inferSchema sur true.

J'utilise la dernière version (1.0.3) du paquet spark-csv

Est-ce que j'ai râté quelque chose?

9
sag

30/07/2015

La dernière version est en fait 1.1. , mais cela n'a pas vraiment d'importance car elle ressemble à inferScheman'est pas incluse dans la dernière version .

17/08/2015

La dernière version du package est désormais 1.2. (publiée le 2015-08-06) et l'inférence de schéma fonctionne comme prévu:

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

En ce qui concerne l'analyse automatique des dates, je doute que cela se produise, ou du moins pas sans fournir de métadonnées supplémentaires.

Même si tous les champs suivent un format de type date, il est impossible de dire si un champ donné doit être interprété comme une date. Il s'agit donc soit d'un manque d'inférence de date automatique, soit d'une feuille de calcul comme le désordre. Sans parler des problèmes avec les fuseaux horaires par exemple.

Enfin, vous pouvez facilement analyser manuellement la chaîne de date:

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)

donc ce n'est vraiment pas un problème sérieux.

20/12/2017 :

Analyseur csv intégré disponible depuis Spark 2.0 prend en charge l'inférence de schéma pour les dates et l'horodatage - il utilise deux options:

  • timestampFormat avec par défaut yyyy-MM-dd'T'HH:mm:ss.SSSXXX
  • dateFormat avec par défaut yyyy-MM-dd

Voir aussi Comment forcer inferSchema pour CSV à considérer les entiers comme des dates (avec l'option "dateFormat")?

11
zero323