【问题标题】:Alternative to deprecated java.sql.Date for Spark DataFrameSpark DataFrame 已弃用的 java.sql.Date 的替代方案
【发布时间】:2019-10-03 04:34:17
【问题描述】:

我正在尝试从头开始创建一个 Spark DataFrame 以进行测试。

关键是我想要一个日期列,为此我使用java.sql.Date,如下所示:

val testSchema = List(
  StructField("test_string", StringType, true),
  StructField("test_date", DateType, true)
)

val testData = Seq(
    Row("hello", new java.sql.Date(2019 - 1900, 9, 29)),
    Row("world", new java.sql.Date(2019 - 1900, 7, 30))
)

val testDF = spark.createDataFrame(
  spark.sparkContext.parallelize(testData),
  StructType(testSchema)
)

这可以完成工作,但不推荐使用 java.sql.Date,所以我尝试使用 java.time.LocalDatejava.util.Date(直接实例化它并从 java.util.GregorianCalendar 获取它)得到相同的结果:

原因:java.lang.RuntimeException:java.util.Date 不是日期模式的有效外部类型

原因:java.lang.RuntimeException:java.time.LocalDate 不是日期模式的有效外部类型

那么与DateType 架构匹配的java.sql.Date 的正确替换是什么?

【问题讨论】:

    标签: scala apache-spark


    【解决方案1】:

    java.sql.Date.valueOf() 应该可以工作:

      import java.sql.Date
    
      val testSchema = List(
        StructField("test_string", StringType, true),
        StructField("test_date", DateType, true)
      )
    
      val testData = Seq(
        Row("hello", Date.valueOf("2019-10-29")),
        Row("world", Date.valueOf("2019-08-30"))
      )
    
      val testDF = spark.createDataFrame(
        spark.sparkContext.parallelize(testData),
        StructType(testSchema)
      )
    
      testDF.show()
      testDF.printSchema()
    
    
    +-----------+----------+
    |test_string| test_date|
    +-----------+----------+
    |      hello|2019-10-29|
    |      world|2019-08-30|
    +-----------+----------+
    
    root
     |-- test_string: string (nullable = true)
     |-- test_date: date (nullable = true)
    

    【讨论】:

      猜你喜欢
      • 2012-04-16
      • 1970-01-01
      • 2016-01-08
      • 2020-11-07
      • 2020-05-22
      • 2022-11-09
      • 1970-01-01
      • 1970-01-01
      • 2018-02-07
      相关资源
      最近更新 更多