如何在expr()中使用列名,而不是在Pyspark中直接使用添加日期的值?

lp0sw83n  于 2022-10-07  发布在  Spark
关注(0)|答案(2)|浏览(151)

我想将基于秒的列(add_value)的值添加到时间戳列(start_date)。

+-----------------------+----------+
|       start_date      | add_value|
+-----------------------+----------+
|2022-09-05 00:00:01.394|  6.001   |
+-----------------------+----------+

使用下面的代码实现直接值效果很好。

(col('start_date') + expr('INTERVAL 6.001 seconds')).alias("end_date")

但是用列的名称替换它是错误的。

(col('start_date') + expr('INTERVAL add_value seconds')).alias("end_date")

错误:

‘秒’或接近‘秒’的语法错误:额外的输入‘秒’(第1行,位置22)

==SQL==间隔ADD_VALUE秒-^^

我应该如何使用该栏的名称?

ar7v8xwq

ar7v8xwq1#

要使用现有列创建间隔,可以串联'interval' + add_value + 'seconds'并将结果字符串转换为INTERVAL类型。然后您可以将其添加到时间戳start_date

from pyspark.sql import functions as F

df.withColumn(
    'end_date',
    F.col('start_date') + F.format_string('interval %s seconds', 'add_value').cast('interval')
).show()

# +-----------------------+---------+-----------------------+

# |start_date             |add_value|end_date               |

# +-----------------------+---------+-----------------------+

# |2022-09-05 00:00:01.394|6.001    |2022-09-05 00:00:07.395|

# +-----------------------+---------+-----------------------+
8wtpewkr

8wtpewkr2#

INTERVAL不允许使用列中的值。但一种简单的方法是将时间戳转换为double,然后添加小数秒。将生成的double值转换为时间戳以获得所需的格式。

spark.sparkContext.parallelize([('2022-09-05 00:00:01.394', 6.001)]).toDF(['start_date', 'add_value']). 
    withColumn('start_date', func.to_timestamp('start_date')). 
    withColumn('start_date_added_value', 
               (func.col('start_date').cast('double') + func.col('add_value')).cast('timestamp')
               ). 
    show(truncate=False)

# +-----------------------+---------+-----------------------+

# |start_date             |add_value|start_date_added_value |

# +-----------------------+---------+-----------------------+

# |2022-09-05 00:00:01.394|6.001    |2022-09-05 00:00:07.395|

# +-----------------------+---------+-----------------------+

相关问题