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
请注意,我已经将选项 interschema 设置为true。
我正在使用spark-csv包的最新版本(1.0.3)
我错过了什么吗?
2015-07-30
最新版本实际上是1.1.0,但这并不重要,因为看起来inferSchema
没有包含在最新版本中。
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 :
内置csv解析器,从Spark 2.0开始支持日期和时间戳的模式推断-它使用两个选项:
-
timestampFormat
与默认yyyy-MM-dd'T'HH:mm:ss.SSSXXX
-
dateFormat
与默认yyyy-MM-dd
另请参阅如何强制CSV的interschema将整数视为日期(使用"dateFormat")选择)?