【问题标题】:Filtering data between two times in pyspark在pyspark中两次过滤数据
【发布时间】:2018-08-25 22:12:51
【问题描述】:

我有一个从 CSV 导入的数据框,其中包含两列(除其他外):日期和时间。 Date 是YYYY-MM-DD 格式的日期字符串,Time 是HH:MM 格式的字符串。当使用inferSchema 将其导入pyspark 时,“日期”会自动推断为日期时间,从而将它们全部解析为午夜(例如2018-05-04 00:00:00.000)。

我需要将数据过滤为仅时间介于两个小时(上午 9 点到下午 5 点)之间的数据。我最基本的想法是纯粹在字符串上过滤,例如

return dataframe.filter( dataframe.Time.like("19%") )

或者,我考虑将日期和时间聚合到一个“时间戳”列中,如下所示(可能非常糟糕,我还在学习 pyspark):

data = data.withColumn( "Timestamp", to_utc_timestamp(concat(date_format(col("Date"), "YYYY-MM-dd "), col("Time")), "GMT") # )

基本上,我怎么能做到这一点,因为我对这两种方法都不感兴趣?如果第二种方法看起来很合理,那么如何进行过滤呢?第二种方法的一个缺点是它为数据框留下了一个新列,这是一个潜在的无法预料的副作用(我正在尝试非常模块化地构建此代码)。

提前致谢。抱歉问题含糊不清,我仍在探索 pyspark 并尝试了解完成任务的不同可能方式。

【问题讨论】:

    标签: apache-spark pyspark apache-spark-sql


    【解决方案1】:

    使用 inferSchema 将其导入 pyspark 时,“日期”会自动推断为日期时间,从而将它们全部解析为午夜(例如 2018-05-04 00:00:00.000)

    为此,您应该使用date_format(col('Date'), 'yyyy-MM-dd'),它将从日期时间中提取日期并将列转换为字符串类型

    现在日期和时间都是 StringType,你可以使用concat_ws(' ', date_format(col('Date'), 'yyyy-MM-dd'), col('Time')) 来连接日期和时间

    现在日期和时间已连接,您可以使用 to_timestamp(concat_ws(' ', date_format(col('Date'), 'yyyy-MM-dd'), col('Time')), 'yyyy-MM-dd HH:mm') 将 StringType dateTime 转换为时间戳

    并使用小时函数提取小时,最后使用过滤器过滤数据框

    所以工作代码将是

    from pyspark.sql.functions import *
    df = df.withColumn('hourOfDay', hour(to_timestamp(concat_ws(' ', date_format(col('Date'), 'yyyy-MM-dd'), col('Time')), 'yyyy-MM-dd HH:mm')))\
            .filter((col('hourOfDay') >= lit(9)) & (col('hourOfDay') <= lit(17)))\
            .drop('hourOfDay')
    

    这应该给你过滤后的期望输出

    希望回答对你有帮助

    【讨论】:

    • 工作就像一个魅力。您的代码还有很多值得了解的技巧(例如,使用 drop、多个条件)。很有帮助,谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-23
    • 2017-03-16
    • 2021-04-10
    • 2022-01-06
    相关资源
    最近更新 更多