>

일부 형식 (YYYY-mm-dd)의 날짜가있는 문자열 열을 날짜/타임 스탬프 열로 변환하려고합니다. 그러나 SQL의 str_to_date 함수를 사용하여 그렇게 할 수 없습니다.

이 날짜를 문자열에서 날짜 형식으로 변환했습니다. 데이터 프레임에서 , 그러나 단일 값으로 작동하지만 대신 날짜 타임 스탬프 변환을 열의 모든 행에 적용하고 싶습니다. 그래서 아래를 시도했습니다

sparkDF = spark.createDataFrame([('a', '2018-01-20'), ('b', '2018-01-21'), ('c', '2018-01-22')], ['name','enroll_DATE'])
>>> sparkDF.show()
+----+-----------+
|name|enroll_DATE|
+----+-----------+
|   a| 2018-01-20|
|   b| 2018-01-21|
|   c| 2018-01-22|
+----+-----------+
>>> sparkDF.printSchema()
root
|-- name: string (nullable = true)
|-- enroll_DATE: string (nullable = true)
sparkDF.registerTempTable('data')
res = spark.sql("select name, enroll_DATE,  TO_DATE(CAST(UNIX_TIMESTAMP(enroll_DATE, '%Y-%m-%d') as TIMESTAMP)) as converted_ED from data ") 

하지만 변환 된 _ 열의 모든 값을 null로 가져옵니다.

DataFrame 작업을 처리하는 더 나은 방법이 있지만 sparkDataframe 변환 방식 으로이 작업을 수행하는 데 제한 (또는 제약 조건)이 있습니다. 기본적으로 spark.sql은 필수입니다.

링크별로 단일 date_string 값에 대해 동일한 작업을 수행 할 수 있으면 열에 대해 동일한 작업을 수행 할 방법이 이미있을 수 있습니다 (알지 못함).

제발하십시오. 감사합니다.

편집

형식 문자열을 '% Y- % m- % d'에서 'YYYY-mm-dd'로 변경하면 변환이 작동했지만 이상한 방식으로 (두 날짜가 다릅니다 !!!!)

res = spark.sql("SELECT name, enroll_DATE, TO_DATE(CAST(UNIX_TIMESTAMP(enroll_DATE, 'YYYY-mm-dd') AS TIMESTAMP)) AS newdate from data")
>>> res.show()
+----+-----------+----------+
|name|enroll_DATE|   newdate|
+----+-----------+----------+
|   a| 2018-01-20|2017-12-31|   ### two dates are different
|   b| 2018-01-21|2017-12-31|
|   c| 2018-01-22|2017-12-31|
+----+-----------+----------+
>>> res.printSchema()
root
|-- name: string (nullable = true)
|-- enroll_DATE: string (nullable = true)
|-- newdate: date (nullable = true)

그러나 여전히 '% Y- % d- % m'형식에 대해서도 동일한 해결책을 찾고 있습니다 (해결책이있는 경우).


  • 답변 # 1

    아래는 'YYYY-mm-dd'형식에서만 작동하지만 dd/mm/YYYY와 같은 다른 형식에서는 작동하지 않습니다

    res = spark.sql("SELECT name, enroll_DATE, TO_DATE(CAST(enroll_DATE AS TIMESTAMP)) AS newdate from data")
    >>> res.show()
    +----+-----------+----------+
    |name|enroll_DATE|   newdate|
    +----+-----------+----------+
    |   a| 2018-01-20|2018-01-20|
    |   b| 2018-01-21|2018-01-21|
    |   c| 2018-01-22|2018-01-22|
    +----+-----------+----------+
    >>> res.printSchema()
    root
    |-- name: string (nullable = true)
    |-- enroll_DATE: string (nullable = true)
    |-- newdate: date (nullable = true)
    
    

  • 답변 # 2

    spark.sql("SELECT name, enroll_date, TO_DATE(CAST(UNIX_TIMESTAMP(enroll_date, 'y-M-d') AS TIMESTAMP)) AS newdate from data")
    
    

    유닉스 스파크 타임 스탬프

    unix_timestamp에 대한 패턴

  • 이전 javascript - SharePoint 2013 페이지에서 windowprint ()가 작동하지 않습니다
  • 다음 php - 변수를 사용하여 다차원 배열을 만드는 방법