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?
30/07/2015
La dernière version est en fait 1.1. , mais cela n'a pas vraiment d'importance car elle ressemble à inferSchema
n'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