我正在尝试将rfc2822 datetime列转换为timestamp列。如果我正在使用数据框之外的变量,则它可以工作。但是在数据框中,我收到一条错误消息

我的进口:

from pyspark.sql.types import *
from pyspark.sql.column import *
from pyspark.sql.functions import *
from email.utils import parsedate_to_datetime


在数据框之外工作的代码是:

datestr = "Thu Sep 12 2019 15:58:30 GMT-0500 (hora estándar de Colombia)"
print(parsedate_to_datetime(datestr))


输出:


  2019-09-12 15:58:30


但是,如果我正在使用此数据框:

df =
spark.createDataFrame(["Thu Sep 12 2019 15:58:30 GMT-0500 (hora estándar de Colombia)"], "string",).toDF("Date")


并尝试使用以下代码创建另一列:

df2 = df.withColumn("timestamp", parsedate_to_datetime(col("Date")))


我收到错误消息:


  “无法将列转换为布尔值:请将'&'用作'and','|'对于
  '或',“ ValueError:无法将列转换为布尔值:请使用'&'
  代表“和”,“ |”构建DataFrame布尔值时为'or',为'〜'为'not'
  表达式。

最佳答案

parsedate_to_datetime注册为UDF以使其与Spark的数据类型互操作:

>>> from pyspark.sql.types import *
>>> from pyspark.sql.column import *
>>> from pyspark.sql.functions import *
>>> from email.utils import parsedate_to_datetime
>>> df = spark.createDataFrame(["Thu Sep 12 2019 15:58:30 GMT-0500 (hora estándar de Colombia)"], "string",).toDF("Date")
>>> parsedate_to_datetime_udf = udf(parsedate_to_datetime, TimestampType())
>>> df2 = df.withColumn("timestamp", parsedate_to_datetime_udf(col("Date")))
>>> df2.show()
+--------------------+-------------------+
|                Date|          timestamp|
+--------------------+-------------------+
|Thu Sep 12 2019 1...|2019-09-12 15:58:30|
+--------------------+-------------------+

07-24 09:52