簡體   English   中英

如何在 pyspark 中將字符串數組轉換為日期?

[英]How to convert array of string to date in pyspark?

這是 dataframe 模式結構。

root
 |-- validFrom: array (nullable = true)
 |    |-- element: string (containsNull = true)

這是 pyspark 查詢,我嘗試在其中獲取validFrom的日期數據類型。

df_02 = spark.sql("""
 select to_date(validFrom, 'yyyy-MM-dd') as  validFrom
 from   v_source_df_flatten
""");

但我收到以下錯誤。

由於數據類型不匹配:參數 1 需要(字符串或日期或時間戳)類型,但是,'v_starhist_df_flatten. validFrom ' 是數組類型。

我必須在to_date中更改什么?

您必須使用transform對數組的每個元素應用to_date

query = """
SELECT transform(validFrom, x -> to_date(x, 'yyyy-MM-dd')) as validFrom
FROM v_source_df_flatten
"""

df_02 = spark.sql(query)

df_02.printSchema()

"""
root
 |-- validFrom: array (nullable = true)
 |    |-- element: date (containsNull = true)
"""

df_02.show(truncate=False)

"""
+------------------------+
|validFrom               |
+------------------------+
|[2021-10-10, 2022-10-10]|
|[2021-01-01, 2022-01-01]|
+------------------------+
"""

您不能將字符串數組直接轉換為DateType to_date function 需要一個字符串日期。

如果每個數組只有一個日期,那么您可以簡單地訪問數組的第一個元素並將其轉換為日期,如下所示:

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 ,如另一個答案所示。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM