python - 在 Spark 中获取上周一

标签 python apache-spark pyspark apache-spark-sql

我正在使用 Spark 2.0 和 Python API。

我有一个数据框,其中有一列类型为 DateType()。我想向包含最近星期一的数据框添加一列。

我可以这样做:

reg_schema = pyspark.sql.types.StructType([
    pyspark.sql.types.StructField('AccountCreationDate', pyspark.sql.types.DateType(), True),
    pyspark.sql.types.StructField('UserId', pyspark.sql.types.LongType(), True)
])
reg = spark.read.schema(reg_schema).option('header', True).csv(path_to_file)
reg = reg.withColumn('monday',
    pyspark.sql.functions.when(pyspark.sql.functions.date_format(reg.AccountCreationDate,'E') == 'Mon',
        reg.AccountCreationDate).otherwise(
    pyspark.sql.functions.when(pyspark.sql.functions.date_format(reg.AccountCreationDate,'E') == 'Tue',
        pyspark.sql.functions.date_sub(reg.AccountCreationDate, 1)).otherwise(
    pyspark.sql.functions.when(pyspark.sql.functions.date_format(reg.AccountCreationDate, 'E') == 'Wed',
        pyspark.sql.functions.date_sub(reg.AccountCreationDate, 2)).otherwise(
    pyspark.sql.functions.when(pyspark.sql.functions.date_format(reg.AccountCreationDate, 'E') == 'Thu',
        pyspark.sql.functions.date_sub(reg.AccountCreationDate, 3)).otherwise(
    pyspark.sql.functions.when(pyspark.sql.functions.date_format(reg.AccountCreationDate, 'E') == 'Fri',
        pyspark.sql.functions.date_sub(reg.AccountCreationDate, 4)).otherwise(
    pyspark.sql.functions.when(pyspark.sql.functions.date_format(reg.AccountCreationDate, 'E') == 'Sat',
        pyspark.sql.functions.date_sub(reg.AccountCreationDate, 5)).otherwise(
    pyspark.sql.functions.when(pyspark.sql.functions.date_format(reg.AccountCreationDate, 'E') == 'Sun',
        pyspark.sql.functions.date_sub(reg.AccountCreationDate, 6))
        )))))))

但是,对于本应相当简单的事情来说,这似乎是很多代码。有更简洁的方法吗?

最佳答案

您可以使用 next_day 确定下一个日期并减去一周。可以按如下方式导入所需的函数:

from pyspark.sql.functions import next_day, date_sub

作为:

def previous_day(date, dayOfWeek):
    return date_sub(next_day(date, "monday"), 7)

最后是一个例子:

from pyspark.sql.functions import to_date

df = sc.parallelize([
    ("2016-10-26", )
]).toDF(["date"]).withColumn("date", to_date("date"))

df.withColumn("last_monday", previous_day("date", "monday"))

结果:

+----------+-----------+
|      date|last_monday|
+----------+-----------+
|2016-10-26| 2016-10-24|
+----------+-----------+

关于python - 在 Spark 中获取上周一,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40271814/

相关文章:

python - 识别整数、字符串和浮点文字

scala - 从其他列在 Apache Spark 中创建映射列

join - 如何在 Apache Spark SQL 中执行更新

python - 如何使用 pyspark 在 Spark 2.0 中构建 sparkSession?

python - 使用Python通过API将一个文件上传到多文件夹谷歌驱动器

python - 返回未排序多维数组 A 中最接近 B 的函数?

python - 流式传输前 BigQuery 表截断不起作用

apache-spark - Java 中的 1-of-k 编码 Apache Spark

apache-spark - 如何使用 spark-csv 包在 HDFS 上仅读取 n 行大型 CSV 文件?

python - 访问 Spark RDD 时闭包中局部变量的使用