Spark-从DateType中提取日期字符串

时间:2018-10-23 07:42:28

标签: apache-spark apache-spark-sql

我有一个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

2 个答案:

答案 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)