Pyspark 在功能和时间上聚合数据

Pyspark 在功能和时间上聚合数据,pyspark,apache-spark-sql,Pyspark,Apache Spark Sql,我有一个10分钟间隔的pyspark数据帧,如何在一个分类特征和2小时的时间内聚合它,然后计算其他两个特征的平均值和第三个特征的第一个值 在pyspark中,我的示例数据如下所示。我想按“ind”和“date”的2小时时间分组,然后计算“sal”的平均值和“imp”的第一个值 from pyspark import SparkContext from pyspark.sql import SQLContext sc = SparkContext.getOrCreate() sqlContext

我有一个10分钟间隔的pyspark数据帧,如何在一个分类特征和2小时的时间内聚合它,然后计算其他两个特征的平均值和第三个特征的第一个值

在pyspark中,我的示例数据如下所示。我想按“ind”和“date”的2小时时间分组,然后计算“sal”的平均值和“imp”的第一个值

from pyspark import SparkContext
from pyspark.sql import SQLContext

sc = SparkContext.getOrCreate()
sqlContext = SQLContext(sc)

 a = sqlContext.createDataFrame([["Anand", "2020-02-01 16:00:00", 12, "ba"], 
                            ["Anand", "2020-02-01 16:10:00", 14,"sa"], 
                            ["Carl", "2020-02-01 16:00:00", 16,"da"], 
                            ["Carl", "2020-02-01 16:10:00", 12,"ga"],
                            ["Eric", "2020-02-01 16:o0:00", 24, "sa"]], ['ind', "date","sal","imp"])
a.show()

|  ind|               date|sal|imp|
+-----+-------------------+---+---+
|Anand|2020-02-01 16:00:00| 12| ba|
|Anand|2020-02-01 16:10:00| 14| sa|
| Carl|2020-02-01 16:00:00| 16| da|
| Carl|2020-02-01 16:10:00| 12| ga|
| Eric|2020-02-01 16:o0:00| 24| sa|

我不知道如何在groupby Pyspark中混合分类功能和时间(2小时)。我知道如何在熊猫身上做。但我的真实数据是巨大的。有什么建议吗?

为了更好地生成查询,我用很少的例子扩展了您的案例

a = spark.createDataFrame([["Anand", "2020-02-01 16:00:00", 12, "ba"], 
                            ["Anand", "2020-02-01 16:10:00", 14,"sa"],
                           ["Anand", "2020-02-01 17:10:00", 14,"sa"],
                           ["Anand", "2020-02-01 18:10:00", 14,"sa"],
                           ["Anand", "2020-02-01 19:10:00", 14,"sa"],
                           ["Anand", "2020-02-01 20:10:00", 14,"sa"],
                           ["Anand", "2020-02-01 21:10:00", 14,"sa"],
                           ["Anand", "2020-02-01 22:10:00", 14,"sa"],
                           ["Anand", "2020-02-01 23:10:00", 14,"sa"],
                           ["Anand", "2020-02-01 00:10:00", 14,"sa"],
                           ["Anand", "2020-02-01 01:10:00", 14,"sa"],
                           ["Anand", "2020-02-01 02:10:00", 14,"sa"],
                           ["Anand", "2020-02-01 03:10:00", 14,"sa"],
                           ["Anand", "2020-02-01 04:10:00", 14,"sa"],
                           ["Anand", "2020-02-01 05:10:00", 14,"sa"],
                           ["Anand", "2020-02-01 06:10:00", 14,"sa"],
                           ["Anand", "2020-02-01 07:10:00", 14,"sa"],
                           ["Anand", "2020-02-01 08:10:00", 14,"sa"],
                           ["Anand", "2020-02-01 09:10:00", 14,"sa"],
                            ["Carl", "2020-02-01 16:00:00", 16,"da"], 
                            ["Carl", "2020-02-01 16:10:00", 12,"ga"],
                            ["Eric", "2020-02-01 16:00:00", 24, "sa"]], ['ind', "date","sal","imp"])

newa=a.withColumn('EveryTwoHour',f.when(f.hour(f.col('date').cast(t.TimestampType()))%2==0,
                                   f.hour(f.col('date').cast(t.TimestampType()))).otherwise(
                                   f.hour(f.col('date').cast(t.TimestampType()))+1))

newa.groupBy('ind','EveryTwoHour').agg(f.avg('sal'),f.first('imp')).orderBy('ind','EveryTwoHour').show()

+-----+------------+--------+-----------------+
|  ind|EveryTwoHour|avg(sal)|first(imp, false)|
+-----+------------+--------+-----------------+
|Anand|           0|    14.0|               sa|
|Anand|           2|    14.0|               sa|
|Anand|           4|    14.0|               sa|
|Anand|           6|    14.0|               sa|
|Anand|           8|    14.0|               sa|
|Anand|          10|    14.0|               sa|
|Anand|          16|    13.0|               ba|
|Anand|          18|    14.0|               sa|
|Anand|          20|    14.0|               sa|
|Anand|          22|    14.0|               sa|
|Anand|          24|    14.0|               sa|
| Carl|          16|    14.0|               da|
| Eric|          16|    24.0|               sa|
+-----+------------+--------+-----------------+

有多种方法可以做到这一点,这只是其中之一

为了每两小时执行一次聚合,我们为每偶数小时创建一个新列,然后在此基础上进行聚合

a.withColumn('EveryTwoHour',f.when(f.hour(f.col('date').cast(t.TimestampType()))%2==0,
                                   f.hour(f.col('date').cast(t.TimestampType()))).otherwise(
    f.hour(f.col('date').cast(t.TimestampType()))+1)).show()

+-----+-------------------+---+---+------------+
|  ind|               date|sal|imp|EveryTwoHour|
+-----+-------------------+---+---+------------+
|Anand|2020-02-01 16:00:00| 12| ba|          16|
|Anand|2020-02-01 16:10:00| 14| sa|          16|
|Anand|2020-02-01 17:10:00| 14| sa|          18|
|Anand|2020-02-01 18:10:00| 14| sa|          18|
|Anand|2020-02-01 19:10:00| 14| sa|          20|
|Anand|2020-02-01 20:10:00| 14| sa|          20|
|Anand|2020-02-01 21:10:00| 14| sa|          22|
|Anand|2020-02-01 22:10:00| 14| sa|          22|
|Anand|2020-02-01 23:10:00| 14| sa|          24|
|Anand|2020-02-01 00:10:00| 14| sa|           0|
|Anand|2020-02-01 01:10:00| 14| sa|           2|
|Anand|2020-02-01 02:10:00| 14| sa|           2|
|Anand|2020-02-01 03:10:00| 14| sa|           4|
|Anand|2020-02-01 04:10:00| 14| sa|           4|
|Anand|2020-02-01 05:10:00| 14| sa|           6|
|Anand|2020-02-01 06:10:00| 14| sa|           6|
|Anand|2020-02-01 07:10:00| 14| sa|           8|
|Anand|2020-02-01 08:10:00| 14| sa|           8|
|Anand|2020-02-01 09:10:00| 14| sa|          10|
| Carl|2020-02-01 16:00:00| 16| da|          16|
+-----+-------------------+---+---+------------+
所以这里,如果我取的是小时,如果它是偶数,那么没有变化,如果这个小时是奇数,那么我在它上面加1,使它成为下一个偶数小时


我希望它能解释逻辑。

为了更好地生成查询,我用很少的例子扩展了您的案例

a = spark.createDataFrame([["Anand", "2020-02-01 16:00:00", 12, "ba"], 
                            ["Anand", "2020-02-01 16:10:00", 14,"sa"],
                           ["Anand", "2020-02-01 17:10:00", 14,"sa"],
                           ["Anand", "2020-02-01 18:10:00", 14,"sa"],
                           ["Anand", "2020-02-01 19:10:00", 14,"sa"],
                           ["Anand", "2020-02-01 20:10:00", 14,"sa"],
                           ["Anand", "2020-02-01 21:10:00", 14,"sa"],
                           ["Anand", "2020-02-01 22:10:00", 14,"sa"],
                           ["Anand", "2020-02-01 23:10:00", 14,"sa"],
                           ["Anand", "2020-02-01 00:10:00", 14,"sa"],
                           ["Anand", "2020-02-01 01:10:00", 14,"sa"],
                           ["Anand", "2020-02-01 02:10:00", 14,"sa"],
                           ["Anand", "2020-02-01 03:10:00", 14,"sa"],
                           ["Anand", "2020-02-01 04:10:00", 14,"sa"],
                           ["Anand", "2020-02-01 05:10:00", 14,"sa"],
                           ["Anand", "2020-02-01 06:10:00", 14,"sa"],
                           ["Anand", "2020-02-01 07:10:00", 14,"sa"],
                           ["Anand", "2020-02-01 08:10:00", 14,"sa"],
                           ["Anand", "2020-02-01 09:10:00", 14,"sa"],
                            ["Carl", "2020-02-01 16:00:00", 16,"da"], 
                            ["Carl", "2020-02-01 16:10:00", 12,"ga"],
                            ["Eric", "2020-02-01 16:00:00", 24, "sa"]], ['ind', "date","sal","imp"])

newa=a.withColumn('EveryTwoHour',f.when(f.hour(f.col('date').cast(t.TimestampType()))%2==0,
                                   f.hour(f.col('date').cast(t.TimestampType()))).otherwise(
                                   f.hour(f.col('date').cast(t.TimestampType()))+1))

newa.groupBy('ind','EveryTwoHour').agg(f.avg('sal'),f.first('imp')).orderBy('ind','EveryTwoHour').show()

+-----+------------+--------+-----------------+
|  ind|EveryTwoHour|avg(sal)|first(imp, false)|
+-----+------------+--------+-----------------+
|Anand|           0|    14.0|               sa|
|Anand|           2|    14.0|               sa|
|Anand|           4|    14.0|               sa|
|Anand|           6|    14.0|               sa|
|Anand|           8|    14.0|               sa|
|Anand|          10|    14.0|               sa|
|Anand|          16|    13.0|               ba|
|Anand|          18|    14.0|               sa|
|Anand|          20|    14.0|               sa|
|Anand|          22|    14.0|               sa|
|Anand|          24|    14.0|               sa|
| Carl|          16|    14.0|               da|
| Eric|          16|    24.0|               sa|
+-----+------------+--------+-----------------+

有多种方法可以做到这一点,这只是其中之一

为了每两小时执行一次聚合,我们为每偶数小时创建一个新列,然后在此基础上进行聚合

a.withColumn('EveryTwoHour',f.when(f.hour(f.col('date').cast(t.TimestampType()))%2==0,
                                   f.hour(f.col('date').cast(t.TimestampType()))).otherwise(
    f.hour(f.col('date').cast(t.TimestampType()))+1)).show()

+-----+-------------------+---+---+------------+
|  ind|               date|sal|imp|EveryTwoHour|
+-----+-------------------+---+---+------------+
|Anand|2020-02-01 16:00:00| 12| ba|          16|
|Anand|2020-02-01 16:10:00| 14| sa|          16|
|Anand|2020-02-01 17:10:00| 14| sa|          18|
|Anand|2020-02-01 18:10:00| 14| sa|          18|
|Anand|2020-02-01 19:10:00| 14| sa|          20|
|Anand|2020-02-01 20:10:00| 14| sa|          20|
|Anand|2020-02-01 21:10:00| 14| sa|          22|
|Anand|2020-02-01 22:10:00| 14| sa|          22|
|Anand|2020-02-01 23:10:00| 14| sa|          24|
|Anand|2020-02-01 00:10:00| 14| sa|           0|
|Anand|2020-02-01 01:10:00| 14| sa|           2|
|Anand|2020-02-01 02:10:00| 14| sa|           2|
|Anand|2020-02-01 03:10:00| 14| sa|           4|
|Anand|2020-02-01 04:10:00| 14| sa|           4|
|Anand|2020-02-01 05:10:00| 14| sa|           6|
|Anand|2020-02-01 06:10:00| 14| sa|           6|
|Anand|2020-02-01 07:10:00| 14| sa|           8|
|Anand|2020-02-01 08:10:00| 14| sa|           8|
|Anand|2020-02-01 09:10:00| 14| sa|          10|
| Carl|2020-02-01 16:00:00| 16| da|          16|
+-----+-------------------+---+---+------------+
所以这里,如果我取的是小时,如果它是偶数,那么没有变化,如果这个小时是奇数,那么我在它上面加1,使它成为下一个偶数小时


我希望它能解释逻辑。

这是一个标准的Spark SQL问题,与
机器学习
熊猫
、或
scikit学习
-请不要垃圾邮件发送不相关的标签(已删除)。您能为问题添加预期的输出吗?这是一个标准的Spark SQL问题,它与
机器学习
熊猫
,或
scikit学习
-请不要发送不相关的标签(已删除)。您能为问题添加预期的输出吗?嗨,Shubham,这真的很有帮助。您想添加一些关于两小时列创建的说明。这对我有帮助better@ManuSharma更新了答案,我如何在日期和每两小时对相同的pyspark数据帧重新采样。这真的很有帮助。您想添加一些关于两小时列创建的说明。这对我有帮助better@ManuSharma更新了答案:我如何在日期和每两小时对同一pyspark数据帧重新采样