Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.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
Dataframe 用pyspark对时间序列数据进行重采样_Dataframe_Apache Spark_Pyspark_Apache Spark Sql - Fatal编程技术网

Dataframe 用pyspark对时间序列数据进行重采样

Dataframe 用pyspark对时间序列数据进行重采样,dataframe,apache-spark,pyspark,apache-spark-sql,Dataframe,Apache Spark,Pyspark,Apache Spark Sql,我有一个timeseries数据,看起来有点像这个时间戳,值: 14 Dec 2020 1000 15 Jan 2021 1000 20 Jan 2021 1000 18 Feb 2021 1000 03 Mar 2021 1000 我基本上是想得到每月的值,平滑每个月的值。每行表示两个日期之间的值,因此如果我们要计算一月的值,我们需要该值来表示: 1月15日,从12月的数值算起+1月15日至1月20日之间的5天+1月20日至2月18日之间的11天 值将计算为与当

我有一个timeseries数据,看起来有点像这个时间戳,值:

14 Dec 2020    1000
15 Jan 2021    1000
20 Jan 2021    1000
18 Feb 2021    1000
03 Mar 2021    1000
我基本上是想得到每月的值,平滑每个月的值。每行表示两个日期之间的值,因此如果我们要计算一月的值,我们需要该值来表示:

1月15日,从12月的数值算起+1月15日至1月20日之间的5天+1月20日至2月18日之间的11天

值将计算为与当前月份相关的天数/整个间隔的长度*值:

一月的数值:15/32*1000+5/5*1000+11/28*1000

我尝试过在窗口函数中使用重采样,但1个月重采样会给我一个例外,而且它只返回间隔,而不是对所有内容进行重采样


任何建议都将不胜感激。谢谢。

您可以使用序列插入日期之间的值,然后按月份分组,并对每个月的值进行平均

编辑:使用来自的自定义项,因为Spark 2.2不支持序列

导入pyspark.sql.F函数 从pyspark.sql.types导入* 导入日期时间 def生成日期系列开始、停止: return[start+datetime.timedeltadays=x表示范围为0的x,stop-start.days+1] spark.udf.registergenerate_date_series,generate_date_series,ArrayTypeDateType 结果=df.withColumn “时间戳”, F.to_dateF.col'timestamp','dd-MMM-yyyy' .withColumn “下一个时间戳”, F.expr 生成日期系列 lagtimestamp,1,timestamp+间隔1天-需要最后一行的默认值 按时间戳+间隔1天超额订购,-不希望包括上一个日期 时间戳 选择 分解“下一个时间戳”。别名“时间戳”, F.col'value'/F.size'next_timestamp'。别名'value' .群比 F.year'timestamp.别名'year', F.month'timestamp'。别名'month' 阿格先生 F.求和'value'。别名'value' .orderBy'year'、'month' result.showtruncate=False +--+---+---------+ |年|月|值| +--+---+---------+ |2020|12 |531.25 | |2021|1 |1848.0603448275874| |2021|2 |1389.920424403183 | |2021|3 |230.76923076923077| +--+---+---------+
您可以使用序列在日期之间插入值,然后按月份分组,并对每个月的值进行平均

编辑:使用来自的自定义项,因为Spark 2.2不支持序列

导入pyspark.sql.F函数 从pyspark.sql.types导入* 导入日期时间 def生成日期系列开始、停止: return[start+datetime.timedeltadays=x表示范围为0的x,stop-start.days+1] spark.udf.registergenerate_date_series,generate_date_series,ArrayTypeDateType 结果=df.withColumn “时间戳”, F.to_dateF.col'timestamp','dd-MMM-yyyy' .withColumn “下一个时间戳”, F.expr 生成日期系列 lagtimestamp,1,timestamp+间隔1天-需要最后一行的默认值 按时间戳+间隔1天超额订购,-不希望包括上一个日期 时间戳 选择 分解“下一个时间戳”。别名“时间戳”, F.col'value'/F.size'next_timestamp'。别名'value' .群比 F.year'timestamp.别名'year', F.month'timestamp'。别名'month' 阿格先生 F.求和'value'。别名'value' .orderBy'year'、'month' result.showtruncate=False +--+---+---------+ |年|月|值| +--+---+---------+ |2020|12 |531.25 | |2021|1 |1848.0603448275874| |2021|2 |1389.920424403183 | |2021|3 |230.76923076923077| +--+---+---------+
最后一个分数应该是11/28?1月20日到2月18日之间只有10+18天,应该是15/32*1000,不是/1000?最后一个分数应该是11/28?1月20日到2月18日之间只有10+18天,应该是15/32*1000,不是/1000?嗨,我收到一个异常,说未定义的函数“序列”。此函数既不是已注册的临时函数,也不是在数据库中注册的永久函数。有什么想法吗?我已经安装了2.2.0。@Ehrendil这只适用于spark 2.4或更高版本。您是否可以更新您的spark版本?2.2已经很老了不幸的是,我觉得这不是我能做的。公司政策等。。。你能想到没有顺序的任何提示吗?@Ehrendil我编辑成使用python udf。这有帮助吗?嗨,我得到一个异常,说是未定义的函数'sequence'。此函数既不是已注册的临时函数,也不是在数据库中注册的永久函数。有什么想法吗?我已经安装了2.2.0。@Ehrendil这只适用于spark 2.4或更高版本。您是否可以更新您的spark版本?2.2已经很老了不幸的是,我觉得这不是我能做的。公司政策等。。。你能想到没有顺序的任何提示吗?@Ehrendil我编辑成使用python udf。这有用吗?