我有一个 Dataframe ,我尝试根据end_date
筛选某个日期是>=
还是<
。
但是,我得到了一个“不可调用”的错误。
line 148, in <module>
df_s1 = df_x.filter(df_x[\"end_date\"].ge(lit(\"2022-08-17\")))
TypeError: 'Column' object is not callable"
下面是我的代码:
df_x = df_x.join(df_di_meet, trim(df_x.application_id) == trim(df_di_meet.application_id), "left")\
.select (df_x["*"], df_di_meet["end_date"])
# ... Cast end_date to timestamp ...end_date format looks like 2013-12-20 23:59:00.0000000
df_x = df_x.withColumn("end_date",(col("end_date").cast("timestamp")))
# ... Here df_s1 >= 2022-08-17
df_s1 = df_x.filter(df_x["end_date"].ge(lit("2022-08-17")))
# ... Here df_s2 < 2022-08-17
df_s2 = df_x.filter(df_x["end_date"].lt(lit("2022-08-17")))
我尝试做的是检查额外的逻辑,就像下面的代码一样,但是由于它不适用于when
子句,我决定分解 Dataframe 并分别检查每个 Dataframe 。有没有更简单的方法,或者我如何才能让下面的代码工作?
df_x = df_x.withColumn("REV_STAT_TYP_DES", when((df_x.review_statmnt_type_desc == lit("")) & (df_x("end_date").ge(lit("2022-08-17"))), "Not Released")
when((df_x.review_statmnt_type_desc == lit("")) & ((df_x("end_date").lt(lit("2022-08-17"))) | (df_x.end_date == lit(""))), "Not Available")
.otherwise(None))
4条答案
按热度按时间roqulrg31#
df_x(“end_date”)--〉这是访问spark Dataframe 列的错误方法。这就是为什么python假设它是一个可调用的,而你得到了这个错误。
df_x[“end_date”] --〉这是访问列(或df_x.end_date)的方式
更新:
现在只注意到,.ge()或.le()类方法不会对spark dataframe列对象起作用.你可以使用以下任何一种方法进行过滤:
oyxsuwqo2#
你可能在Pandas和pyspark之间搞混了。不管怎样,这就是你怎么做的
数据框
皮斯帕克
Pandas
或
x7yiwoj43#
在expr()函数中使用SQL风格的自由格式大小写/when语法。这样它也是可移植的。
bqf10yzr4#
有些人试图让复杂的代码看起来更简洁。根据这些建议,如果将条件语句分离成不同的变量,它们可能会更好地被理解和维护。看看我是如何将
isnull
添加到一些变量中的a-如果它们没有被重构成单独的变量,这将变得更加困难。此外,如果
otherwise
子句返回null
(默认行为),则不需要otherwise
子句。