我正在尝试将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|
+--------------------+-------------------+