AttributeError:'DataFrame'对象没有属性'timestamp'

时间:2017-11-23 17:16:51

标签: python pyspark

我想只选择那些时间戳属于过去36小时的行。我的PySpark DataFrame df有一个列unix_timestamp,它是一个以秒为单位的时间戳。 这是我当前的代码,但它失败并显示错误AttributeError: 'DataFrame' object has no attribute 'timestamp'。我试图将其更改为unix_timestamp,但它一直都会失败。

import datetime
hours_36 = (datetime.datetime.now() - datetime.timedelta(hours = 36)).strftime("%Y-%m-%d %H:%M:%S")

df = df.withColumn("unix_timestamp", df.unix_timestamp.cast("timestamp")).filter(df.timestamp > hours_36)

2 个答案:

答案 0 :(得分:1)

当您尝试引用它时,时间戳列仍然不存在;您可以使用pyspark.sql.functions.col以动态方式引用它,而无需指定列所属的数据框对象:

import pyspark.sql.functions as F

df = df.withColumn("unix_timestamp", df.unix_timestamp.cast("timestamp")).filter(F.col("unix_timestamp") > hours_36)

或者不创建中间列:

df.filter(df.unix_timestamp.cast("timestamp") > hours_36)

答案 1 :(得分:0)

API Doc告诉我您也可以使用String表示法进行过滤: https://spark.apache.org/docs/latest/api/python/pyspark.sql.html#pyspark.sql.DataFrame.filter

    import pyspark.sql.functions as F

df = df.withColumn("unix_timestamp", df.unix_timestamp.cast("timestamp"))
    .filter("unix_timestamp > %s" % hours_36)

虽然

可能不那么有效