Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/281.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python PySpark中具有多列的日期算法_Python_Apache Spark_Pyspark_Spark Dataframe - Fatal编程技术网

Python PySpark中具有多列的日期算法

Python PySpark中具有多列的日期算法,python,apache-spark,pyspark,spark-dataframe,Python,Apache Spark,Pyspark,Spark Dataframe,我正在尝试使用PySpark数据帧中的多列执行一些中等复杂的日期算法。基本上,我有一个名为number的列,它表示在时间戳处创建后需要过滤的周数。在PostgreSQL中,您可以乘以,但我似乎不知道如何使用SQL API或Python API在PySpark中实现这一点。这里的任何帮助都将不胜感激 import datetime from pyspark.sql import SQLContext from pyspark.sql import Row from pyspark import S

我正在尝试使用PySpark数据帧中的多列执行一些中等复杂的日期算法。基本上,我有一个名为
number
的列,它表示在
时间戳处创建
后需要过滤的周数。在PostgreSQL中,您可以乘以,但我似乎不知道如何使用SQL API或Python API在PySpark中实现这一点。这里的任何帮助都将不胜感激

import datetime
from pyspark.sql import SQLContext
from pyspark.sql import Row
from pyspark import SparkContext

sc = SparkContext()
sqlContext = SQLContext(sc)
start_date = datetime.date(2020,1,1)

my_df = sc.parallelize([
        Row(id=1, created_at=datetime.datetime(2020, 1, 1), number=1,  metric=10),
        Row(id=1, created_at=datetime.datetime(2020, 1, 1), number=2,  metric=10),
        Row(id=1, created_at=datetime.datetime(2020, 1, 1), number=3,  metric=10),
        Row(id=2, created_at=datetime.datetime(2020, 1, 15), number=1,  metric=20),
        Row(id=2, created_at=datetime.datetime(2020, 1, 15), number=2,  metric=20),
        Row(id=3, created_at=datetime.datetime(2020, 7, 1), number=7,  metric=30),
        Row(id=3, created_at=datetime.datetime(2020, 7, 1), number=8,  metric=30),
        Row(id=3, created_at=datetime.datetime(2020, 7, 1), number=9,  metric=30),
        Row(id=3, created_at=datetime.datetime(2020, 7, 1), number=10, metric=30),
    ]).toDF()


# This doesn't work!
new_df = my_df.where("created_at + interval 7 days * number > '" + start_date.strftime("%Y-%m-%d") +"'")
# Neither does this!
new_df = my_df.filter(my_df.created_at + datetime.timedelta(days=my_df.number * 7)).date() > start_date.date()

有一种可能需要将日期转换为字符串,使用python中的
datetime
库将字符串转换为
datetime
对象,然后执行该操作,但这似乎很疯狂,我使用
expr
和内置的
date\u add
函数找到了前进的方向

from pyspark.sql.functions import expr, date_add
new_df = my_df.withColumn('test', expr('date_add(created_at, number*7)'))
filtered = new_df.filter(new_df.test > start_date)
filtered.show()
但是,如果其他人想添加,我想了解一下这在一般情况下是如何/为什么工作的