如何将pysparkDataframe中的timestamp列值减少1ms

llycmphe  于 2021-05-27  发布在  Spark
关注(0)|答案(3)|浏览(381)

我有pysparkDataframe,其中有时间戳列,我想减少1毫秒的时间戳。spark中是否有一些内置函数可用于处理此类场景?
例如,timestamp列的值:timestamp value:2020-07-13 17:29:36

vyswwuz2

vyswwuz21#

还可以将interval与expr一起使用。

  1. import pyspark.sql.functions as F
  2. df = spark.createDataFrame(
  3. [
  4. (1, '2020-07-13 17:29:36')
  5. ],
  6. [
  7. 'id', 'time'
  8. ]
  9. )
  10. df.withColumn(
  11. 'time',
  12. F.col('time').cast('timestamp')
  13. ).withColumn(
  14. 'timediff',
  15. (
  16. F.col('time') - F.expr('INTERVAL 1 milliseconds')
  17. ).cast('timestamp')
  18. ).show(truncate=False)
展开查看全部
r7s23pms

r7s23pms2#

通过使用double type,您可以做到这一点。

  1. import pyspark.sql.functions as f
  2. df = spark.createDataFrame([(1, '2020-07-13 17:29:36')], ['id', 'time'])
  3. df.withColumn('time', f.to_timestamp('time', 'yyyy-MM-dd HH:mm:ss')) \
  4. .withColumn('timediff', (f.col('time').cast('double') - f.lit(0.001)).cast('timestamp')) \
  5. .show(10, False)
  6. +---+-------------------+-----------------------+
  7. |id |time |timediff |
  8. +---+-------------------+-----------------------+
  9. |1 |2020-07-13 17:29:36|2020-07-13 17:29:35.999|
  10. +---+-------------------+-----------------------+
cgh8pdjw

cgh8pdjw3#

你可以用 pyspark.sql.functions.expr 减去 INTERVAL 1 milliseconds ```
from pyspark.sql.functions import expr

df = spark.createDataFrame([('2020-07-13 17:29:36',)], ['time'])
df = df.withColumn('time2', expr("time - INTERVAL 1 milliseconds"))
df.show(truncate=False)

+-------------------+-----------------------+

|time |time2 |

+-------------------+-----------------------+

|2020-07-13 17:29:36|2020-07-13 17:29:35.999|

+-------------------+-----------------------+

  1. 即使 `time` 是这种格式的字符串,spark将为您进行隐式转换。

df.printSchema()

root

|-- time: string (nullable = true)

|-- time2: string (nullable = true)

展开查看全部

相关问题