【问题标题】:Error while applying filter on dataframe - PySpark在数据帧上应用过滤器时出错 - PySpark
【发布时间】:2021-09-03 08:08:09
【问题描述】:

我需要从 run_date 中减去 10 天并在数据帧上应用过滤器。但是在运行下面的代码时会出现错误。 - 错误:AnalysisException:“无法解析 '2020-01-10' 给定输入列:[cust, activity_day];\n'Filter (to_date(activity_day#1341, Some(YYYY-MM-DD)) > date_sub(cast(to_date ('2020-01-10, Some(YYYY-MM-DD)) as date), 10))\n+- LogicalRDD [cust#1340L, activity_day#1341]\n"。

数据:

df = spark.createDataFrame(
        [
          (123,"2020-01-01"),
          (123,"2020-01-01"),
          (123,"2019-01-01")
        ],
        ("cust", "activity_day")
    )

代码:我需要从 run_date 中减去 10 天并在数据帧上应用过滤器

from pyspark.sql.functions import *

subtract_days=10
run_date = to_date("2020-01-10","YYYY-MM-DD").cast("date")
df.filter(to_date(df["activity_day"],"YYYY-MM-DD") > date_sub(run_date,subtract_days)).show()

谁能帮忙?

【问题讨论】:

    标签: python python-3.x pyspark


    【解决方案1】:

    to_date 函数仅适用于列属性。因此,您需要使用 lit 函数创建一列 run_date 文字值

    from pyspark.sql.functions import *
    
    subtract_days=10
    run_date = to_date(lit("2020-01-10"),"YYYY-MM-DD")
    df.filter(to_date(df["activity_day"],"YYYY-MM-DD") > date_sub(run_date,subtract_days)).show()
    

    【讨论】:

    • 感谢 Drashti。当我检查以下语句的类型时,在这两种情况下,我的类型都是 pyspark.sql.column.Column。所以你能帮我理解这些有什么不同吗? run_day = to_date("2020-01-10","YYYY-MM-DD") print(type(run_day)) run_date = to_date(lit("2020-01-10"),"YYYY-MM-DD")打印(类型(运行日期))
    • 那是因为to_date函数返回列
    猜你喜欢
    • 2017-03-16
    • 2021-04-10
    • 1970-01-01
    • 2017-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多