【问题标题】:How to convert array of string to date in pyspark?如何在pyspark中将字符串数组转换为日期?
【发布时间】:2022-01-02 11:40:11
【问题描述】:

这是数据框架构结构。

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

这是我尝试获取 validFrom 的日期数据类型的 pyspark 查询。

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 函数中进行哪些更改?

【问题讨论】:

    标签: json apache-spark pyspark apache-spark-sql


    【解决方案1】:

    您必须使用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]|
    +------------------------+
    """
    

    【讨论】:

      【解决方案2】:

      您不能将字符串数组直接转换为DateTypeto_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,如另一个答案所示。

      【讨论】:

        猜你喜欢
        • 2023-01-10
        • 2020-08-15
        • 1970-01-01
        • 1970-01-01
        • 2016-10-31
        • 2019-10-27
        • 2020-10-09
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多