spark-csv包中的inferSchema功能

13

在Spark中,当CSV文件以dataframe的形式被读取时,所有的列都会被读取为字符串。是否有办法获取列的实际类型?

我有以下的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 包。

这里有什么我忽略的吗?

1个回答

16
2015-07-30 最新版本实际上是1.1.0,但由于看起来inferSchema不包含在最新版本中,所以并不重要。 2015-08-17 该软件包的最新版本现在是1.2.0(发布于2015年8月6日),模式推断按预期工作:
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

另请参见如何强制使用“dateFormat”选项将整数视为日期的CSV推断模式?


很好的解释,但是是否可能使任何字段 nullable=false? - Kuldeep Singh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接