spark.sql str_to_date替代

时间:2018-01-23 13:23:46

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

我正在尝试将具有某种格式(YYYY-mm-dd)日期的字符串列转换为日期/时间戳列。但是不能通过使用sql的str_to_date函数来实现。

我已经遵循了这个Convert date from String to Date format in Dataframes,但它适用于单个值,而我希望将日期时间戳转换应用于列的所有行,所以我尝试了以下

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 ")  

但是将converted_ED列的所有值都设为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'格式也是(如果有任何解决方案。)。

2 个答案:

答案 0 :(得分:0)

以下仅适用于'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)

答案 1 :(得分:0)

public function getBase64ImageSize($base64Image){ //return memory size in B, KB, MB
    try{
        $size_in_bytes = (int) (strlen(rtrim($base64Image, '=')) * 3 / 4);
        $size_in_kb    = $size_in_bytes / 1024;
        $size_in_mb    = $size_in_kb / 1024;

        return $size_in_mb;
    }
    catch(Exception $e){
        return $e;
    }
}

unix_timestamp in spark

Pattern for unix_timestamp