【问题标题】:inferSchema in spark-csv packagespark-csv 包中的 inferSchema
【发布时间】:2015-10-21 13:30:40
【问题描述】:

当 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。

我正在使用最新版本(1.0.3)的 spark-csv 包

我错过了什么吗?

【问题讨论】:

    标签: scala apache-spark apache-spark-sql spark-csv


    【解决方案1】:

    2015-07-30

    最新的版本其实是1.1.0,不过没关系,因为它看起来像inferSchemais not included in the latest release。

    2015-08-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)
    

    关于自动日期解析,我怀疑它永远不会发生,或者至少在不提供额外元数据的情况下不会发生。

    即使所有字段都遵循某种类似日期的格式,也无法确定是否应将给定字段解释为日期。因此,要么是缺少自动日期推断,要么是电子表格之类的混乱。更不用说时区问题了。

    终于可以轻松手动解析日期字符串了:

    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 解析器支持日期和时间戳的模式推断 - 它使用两个选项:

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

    另见How to force inferSchema for CSV to consider integers as dates (with "dateFormat" option)?

    【讨论】:

    • 很好的解释,但是否可以让任何字段为 nullable=false?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-11-17
    • 2021-12-05
    • 2022-01-23
    • 2015-11-11
    • 1970-01-01
    • 1970-01-01
    • 2018-03-13
    相关资源
    最近更新 更多