【问题标题】:PySpark Dataframe: Remove rows by datesPySpark Dataframe:按日期删除行
【发布时间】:2021-01-01 04:01:30
【问题描述】:

我想将我的 spark 数据框减少到某个日期之后的日期,例如 2020-03-01。

通过 sql 加载数据为我提供了数据列的字符串,因此我在尝试通过数据比较删除行之前对其进行了更改。

不幸的是,我下面的方法导致一个空的df。

query = "select id, date , volume from "+ INPUT_DB + "." + INPUT_TABLE
sdf_monthly = spark.sql(query)
sdf_monthly.count()
>>>113683937

sdf_monthly=sdf_monthly.withColumn("date", F.to_date(F.unix_timestamp(sdf_monthly["date"],"YYYY-MM-DD").cast("timestamp")))
sdf_monthly_new =sdf_monthly.filter(sdf_monthly["date"] >= F.unix_timestamp(F.lit('2020-03-01')).cast('timestamp'))
sdf_monthly_new.count()
>>>0

【问题讨论】:

    标签: sql dataframe date pyspark


    【解决方案1】:

    这可能是因为您将日期与 linux 时间戳进行比较。试试:

    sdf_monthly_new =sdf_monthly.filter(sdf_monthly["date"] >= F.to_date(F.unix_timestamp(F.lit('2020-03-01')).cast('timestamp')))
    sdf_monthly_new.count()
    

    【讨论】:

    • 谢谢,好点 - 但不幸的是给出了相同的结果。
    • 过滤后你能验证你确实有数据吗?您可以尝试使用 SQL query = "select id, date , volume from "+ INPUT_DB + "." + INPUT_TABLE + "WHERE date > ='2020-03-01'" 进行过滤
    • 是的,我从那个开始,但这也给了我一个空的数据框。我认为这是因为日期列以字符串形式出现。我尝试的另一个解决方案是在 sql 查询中将日期定义为 Datetype,但这也会导致空 df。 "select id, cast(to_dat(from_unixtime(unix_timestamp(date_as_of))) as date) , volume from "+ INPUT_DB + "." + INPUT_TABLE + "WHERE date_as_of > ='2020-03-01'" 但原因并不是没有确定的日期 >= 2020-03-01 的数据。
    • 您使用的是什么数据库(MySQL、SQLServer、Oracle、Postgres 等)。您可以使用表的 DDL(CREATE TABLE 语句)和一些示例数据来更新问题吗? 3-4 行数据量
    • 测试您是否有数据的一种方法是订购数据框并检查第一行。 sdf_monthly_new =sdf_monthly.orderBy('date', ascending=False)sdf_monthly_new.first()
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-28
    • 1970-01-01
    相关资源
    最近更新 更多