Spark 3.1中日期和inferSchema选项存在问题

3
我有一个CSV文件,其中包含一个日期列,如下所示:
datecol
----------
2021-01-11
2021-02-15
2021-02-10
2021-04-22

如果我在Spark版本2.4.5中启用了inferSchema来读取这个文件,我会得到以下模式:
root
 |-- datecol: timestamp (nullable = true)

但在Spark 3.1以下,输出如下。
root
 |-- datecol: string (nullable = true)

我查看了Spark文档中的迁移指南,但没有找到关于此事的任何信息。
请问有人能够确认这是一个错误还是我需要使用其他配置吗?
1个回答

3
这是 Spark 迁移到 Java 8 新的日期 API 后出现的影响,自 Spark 3+ 版本以来。您可以从迁移指南中了解情况:

时间戳/日期字符串的解析/格式化。这会影响 CSV/JSON 数据源[...]。新实现对其输入进行了严格检查。例如,如果解析器未消耗整个输入,则无法解析2015-07-22 10:00:00 时间戳,如果模式为 yyyy-MM-dd。另一个例子是31/01/2015 00:00 的输入不能被dd/MM/yyyy hh:mm 模式解析,因为hh 假设小时在1-12范围内。在Spark 2.4及以下版本中,timestamp/date 字符串转换使用java.text.SimpleDateFormat[...]。

事实上,inferSchema 仅检测到 TimestampType 而不是 DateType。由于在默认情况下,在CSV 数据源中,参数 timestampFormatyyyy-MM-dd'T'HH:mm:ss[.SSS][XXX],因此由于上述原因它不会被转换为时间戳。

您可以尝试在加载 CSV 时添加选项:

val df = spark.read.option("inferSchema", "true").option("timestampFormat", "yyyy-MM-dd").csv("/path/csv")

谢谢您的回答。我尝试使用timestampFormat选项,但它仅推断出字符串类型。 - Mohana B C
1
@MohanaBC 你在选项中指定了 inferSchema=true 吗?我可以使用上面的代码获取被推断为时间戳的列。 - blackbishop
哦!我错过了那个。添加了 inferSchema 后它可以工作了!谢谢。 - Mohana B C

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