我正在读取 csv 文件,其中一列中有一个应转换为日期时间的字符串。该字符串的形式为MM/dd/yyyy HH:mm
。但是,当我尝试使用 joda-time 对其进行转换时,我总是收到错误:
线程“main”中的异常 java.lang.UnsupportedOperationException:不支持 org.joda.time.DateTime 类型的架构
我不知道具体是什么问题...
val input = c.textFile("C:\\Users\\AAPL.csv").map(_.split(",")).map{p =>
val formatter: DateTimeFormatter = DateTimeFormat.forPattern("MM/dd/yyyy HH:mm");
val date: DateTime = formatter.parseDateTime(p(0));
StockData(date, p(1).toDouble, p(2).toDouble, p(3).toDouble, p(4).toDouble, p(5).toInt, p(6).toInt)
}.toDF()
有谁可以帮忙吗?
我不知道具体是什么问题...
嗯,问题的根源几乎可以通过错误消息来描述。 Spark SQL 不支持 Joda-TimeDateTime
作为输入。日期字段的有效输入是java.sql.Date
(see Spark SQL 和 DataFrame 指南,数据类型供参考 http://spark.apache.org/docs/latest/sql-programming-guide.html#data-types).
最简单的解决办法就是调整StockData
类所以需要java.sql.Data
作为参数并替换:
val date: DateTime = formatter.parseDateTime(p(0))
像这样的东西:
val date: java.sql.Date = new java.sql.Date(
formatter.parseDateTime(p(0)).getMillis)
or
val date: java.sql.Timestamp = new java.sql.Timestamp(
formatter.parseDateTime(p(0)).getMillis)
如果你想保留小时/分钟。
如果您考虑使用带有 range 子句的窗口函数,更好的选择是将字符串传递给 DataFrame 并将其转换为整数时间戳:
import org.apache.spark.sql.functions.unix_timestamp
df.withColumn("ts", unix_timestamp($"date", "MM/dd/yyyy HH:mm"))
See Spark 窗口函数 - rangeBetween 日期 https://stackoverflow.com/q/33207164/1560062了解详情。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)