您不能将字符串数组直接转换为DateType。 to_date 函数需要一个字符串日期。
如果每个数组只有一个日期,那么您可以简单地访问数组的第一个元素并将其转换为日期,如下所示:
spark.createDataFrame(
[(["2022-01-01"],), (["2022-01-02"],)], ["validFrom"]
).createOrReplaceTempView("v_source_df_flatten")
df_02 = spark.sql("select to_date(validFrom[0]) as validFrom from v_source_df_flatten")
df_02.printSchema()
#root
# |-- validFrom: date (nullable = true)
df_02.show()
#+----------+
#| validFrom|
#+----------+
#|2022-01-01|
#|2022-01-02|
#+----------+
请注意,您也可以使用简单转换,因为您的日期具有默认模式 yyyy-MM-dd:
cast(validFrom[0] as date) as validFrom
但是,如果您的意图是将字符串数组转换为日期数组,那么您可以在这种特殊情况下使用强制转换:
df_02 = spark.sql("select cast(validFrom as array<date>) as validFrom from v_source_df_flatten")
df_02.printSchema()
#root
# |-- validFrom: array (nullable = true)
# | |-- element: date (containsNull = true)
df_02.show()
#+------------+
#| validFrom|
#+------------+
#|[2022-01-01]|
#|[2022-01-02]|
#+------------+
对于不同于yyyy-MM-dd 的日期模式,您必须在数组上使用transform 并为每个元素应用to_date,如另一个答案所示。