pyspark “列”对象不可调用”- ge le gt lt方法

vc6uscn9  于 2022-11-01  发布在  Spark
关注(0)|答案(4)|浏览(110)

我有一个 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))
roqulrg3

roqulrg31#

df_x(“end_date”)--〉这是访问spark Dataframe 列的错误方法。这就是为什么python假设它是一个可调用的,而你得到了这个错误。
df_x[“end_date”] --〉这是访问列(或df_x.end_date)的方式

更新

现在只注意到,.ge()或.le()类方法不会对spark dataframe列对象起作用.你可以使用以下任何一种方法进行过滤:

from pyspark.sql.functions import col

df_s1 = df_x.filter(df_x["end_date"] >='2022-08-17')

# OR

df_s1 = df_x.filter(df_x.end_date>='2022-08-17')

# OR

df_s1 = df_x.filter(col('end_date')>='2022-08-17')

# OR

df_s1 = df_x.filter("end_date>='2022-08-17'")

# OR

# you can use df_x.where() instead of df_x.filter
oyxsuwqo

oyxsuwqo2#

你可能在Pandas和pyspark之间搞混了。不管怎样,这就是你怎么做的
数据框

df=spark.createDataFrame([("2022-08-16",1),("2019-06-24",2),("2022-08-19",3)]).toDF("date","increment")#

皮斯帕克

df_x = df.withColumn('date', to_date('date'))
df_x.filter(col('date')>(to_date(lit("2022-08-17")))).show()

Pandas

df_x = df.toPandas()

df_s1 = df_x.assign(date= pd.to_datetime(df_x['date'])).query("date.gt('2022-08-17')", engine='python')

df_x[df_x['date']>'2022-08-17']
x7yiwoj4

x7yiwoj43#

在expr()函数中使用SQL风格的自由格式大小写/when语法。这样它也是可移植的。

df_x = (df_x.withColumn("REV_STAT_TYP_DES",
         expr(""" case 
                  when review_statmnt_type_desc='' and  end_date >='2022-08-17' then 'Not Released'
                  when review_statmnt_type_desc='' and  ( end_date <'2022-08-17' or end_date is null ) then 'Not Available'
                  else null 
                 end 
           """)
bqf10yzr

bqf10yzr4#

有些人试图让复杂的代码看起来更简洁。根据这些建议,如果将条件语句分离成不同的变量,它们可能会更好地被理解和维护。看看我是如何将isnull添加到一些变量中的a-如果它们没有被重构成单独的变量,这将变得更加困难。

from pyspark.sql import functions as F

no_review = (F.col("review_statmnt_type_desc") == "") | F.isnull("review_statmnt_type_desc")
no_end_date = (F.col("end_date") == "") | F.isnull("end_date")
not_released = no_review & (F.col("end_date") >= F.lit("2022-08-17"))
not_available = no_review & ((F.col("end_date") < F.lit("2022-08-17")) | no_end_date)

此外,如果otherwise子句返回null(默认行为),则不需要otherwise子句。

df_x = df_x.withColumn(
    "REV_STAT_TYP_DES",
    F.when(not_released, "Not Released")
     .when(not_available, "Not Available")
)

相关问题