infer -chema in spark-csv包

sag*_*sag 6 scala apache-spark apache-spark-sql spark-csv

当CSV作为spark中的数据帧读取时,所有列都将作为字符串读取.有没有办法获得实际的列类型?

我有以下csv文件

Name,Department,years_of_experience,DOB
Sam,Software,5,1990-10-10
Alex,Data Analytics,3,1992-10-10
Run Code Online (Sandbox Code Playgroud)

我已使用以下代码阅读了CSV

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

所有列都读为字符串.我希望将years_of_experience列读作intDOB作为日期读取

请注意,我已将选项inferSchema设置为true.

我使用的是spark-csv软件包的最新版本(1.0.3)

我在这里错过了什么吗?

zer*_*323 11

二零一五年七月三十零日

最新版本实际上是1.1.0,但它并不重要,因为它看起来inferSchema 没有包含在最新版本中.

2015年8月17日

该软件包的最新版本现在为1.2.0(发布于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)
Run Code Online (Sandbox Code Playgroud)

关于自动日期解析,我怀疑它是否会发生,或者至少在没有提供额外元数据的情况下.

即使所有字段都遵循某种类似日期的格式,也不可能说某个字段是否应该被解释为日期.因此,要么是缺乏自动日期推断,要么是像乱七八糟的电子表格.更不用说时区问题了.

最后,您可以轻松地手动解析日期字符串:

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)
Run Code Online (Sandbox Code Playgroud)

所以这真的不是一个严重的问题.

2017-12-20:

内置的csv解析器可用,因为Spark 2.0支持日期和时间戳的模式推断 - 它使用两个选项:

  • timestampFormat 默认情况下 yyyy-MM-dd'T'HH:mm:ss.SSSXXX
  • dateFormat 默认情况下 yyyy-MM-dd

另请参见如何强制inferSchema for CSV将整数视为日期(使用"dateFormat"选项)?