我有一个Row对象,其中包含DateType类型的列之一。
我正在从该Row对象提取单个字段值,如下所示:
val eventDate = row.getAs[DateType](0)
val recordCount = row.getAs[Long](1)
我想从eventDate中提取日期值的字符串表示形式。我怎样才能做到这一点? Intellij建议对名为formatd的eventDate使用以下方法:
val eventDateString = row.getAs[DateType](0).formatted("yyyy-MM-dd")
但是,执行后,eventDateString中的值为“ yyyy-MM-dd”,而不是date的实际值。如何获取字符串表示形式的实际日期值。
此外,我无法在下面的链接中的Spark2文档中找到formatted(format:String)方法。我想知道为什么在文档未显示Intellij时却显示此方法。请帮忙。
https://spark.apache.org/docs/2.2.1/api/java/org/apache/spark/sql/types/DateType.html
答案 0 :(得分:0)
代码:
val schema = StructType(List(new StructField("event_date", DateType)))
val data = Seq(Row(Date.valueOf("2018-10-21")), Row(Date.valueOf("2018-10-22")))
val df = spark.createDataFrame(spark.sparkContext.parallelize(data), schema)
df.printSchema()
df.show()
//here it will cast date type to string type
df.foreach { row =>
println(row.getAs[String]("event_date"))
}
样本输出:
root
|-- event_date: date (nullable = true)
+----------+
|event_date|
+----------+
|2018-10-21|
|2018-10-22|
+----------+
2018-10-21
2018-10-22
注意:已在Spark 2.2.0和Scala 2.11.8中进行测试
答案 1 :(得分:0)
谢谢,我理解您的回复。最初,我做过同样的事情,但是在投射过程中出现错误。请参阅下面的内容。
当Date强制转换为String时,我遇到异常。我的数据帧是通过Spark SQL生成的,而不是通过上图中的并行化生成的:
val fileResultDataFrame = spark.sql("select to_date(event_time) event_date,count(*) count from SINGLE_FILE_VIEW group by to_date(event_time)")
val fileRowListIterator = fileResultDataFrame.collectAsList().iterator()
var eventDateAndRowCountString:String = ""
while(fileRowListIterator.hasNext){
val row = fileRowListIterator.next()
val eventDate = row.getAs[String]("event_date")
val recordCount = row.getAs[Long]("count")
eventDateAndRowCountString = eventDateAndRowCountString + "|" + eventDate + "=" + recordCount
}
Exception in thread "main" java.lang.ClassCastException: java.sql.Date cannot be cast to java.lang.String
at HBase$.updateEventDateAndCountForAllFiles(HBaseHandler.scala:235)