pySpark 时间戳作为字符串到日期时间

时间:2021-03-31 21:21:57

标签: pyspark

我从 CSV 中读取,其中列时间包含一个带毫秒的时间戳“1414250523582” 当我在架构中使用 TimestampType 时,它​​返回 NULL。 准备我的数据的唯一方法是使用 StringType。

现在我需要将此值作为用于进一步处理的日期时间。 首先,我用这个去掉了很长的时间戳:

df2 = df.withColumn("date", col("time")[0:10].cast(IntegerType()))

模式检查现在说它是一个整数。 现在我尝试将其设为日期时间

df3 = df2.withColumn("date", datetime.fromtimestamp(col("time")))

它回来了

TypeError: an integer is required (got type Column)

当我使用 google 搜索时,人们总是只使用 col("x") 来读取和转换数据,那么我在这里做错了什么?

1 个答案:

答案 0 :(得分:1)

模式检查有点棘手;该列中的数据可能是 pyspark.sql.types.IntegerType,但这不等同于 Python 的 int 类型。 col 函数返回一个 pyspark.sql.column.Column 对象,该对象通常不能很好地与 datetime.fromtimestamp 等普通 Python 函数配合使用。这解释了 TypeError。即使实际行中的“日期”数据是一个整数,col 也不允许您以整数形式访问它以非常简单地馈入 python 函数。要将任意 Python 代码应用于该整数值,您可以非常轻松地 compile a udf,但在这种情况下,pyspark.sql.functions 已经为您的 unix 时间戳提供了解决方案。试试这个:df3 = df2.withColumn("date", from_unixtime(col("time"))),对于您的示例,您应该会看到 2014 年是一个不错的日期。

小提示:这个“日期”列将是 StringType