当CSV作为spark中的数据框读取时,所有列都将作为字符串读取。有没有办法获得实际的列类型?
我有以下csv文件
Name,Department,years_of_experience,DOB
Sam,Software,5,1990-10-10
Alex,Data Analytics,3,1992-10-10
我已使用以下代码
阅读了CSVval 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 。
我使用的是spark-csv软件包的最新版本(1.0.3)
我在这里错过了什么吗?
答案 0 :(得分:9)
<强> 2015年7月30日强>
最新版本实际上是1.1.0,但它并不重要,因为它看起来像inferSchema
is not included in the latest release。
<强> 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)
关于自动日期解析,我怀疑它是否会发生,或者至少在没有提供额外元数据的情况下。
即使所有字段都遵循某种类似日期的格式,也不可能说某个字段是否应该被解释为日期。所以它要么缺乏自动日期推断,要么就像乱七八糟的电子表格。更不用说时区问题了。
最后,您可以轻松手动解析日期字符串:
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)
所以这真的不是一个严重的问题。
<强>二○一七年十二月二十零日强>:
内置的csv解析器可用,因为Spark 2.0支持日期和时间戳的模式推断 - 它使用两个选项:
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)?