我想只选择那些时间戳属于过去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)
答案 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)
虽然
可能不那么有效