【问题标题】:PySpark - Sequential Counts with Pandas UDFPySpark - 使用 Pandas UDF 进行顺序计数
【发布时间】:2018-04-18 10:10:07
【问题描述】:

我有一个列数据集,该数据集在同一月份的任何列的值都在增加,然后在下个月重置。

+----------+------+-----------+----+-----------+------------+
|      Date|column|column_2   |co_3|column_4   |column_5    |
+----------+------+-----------+----+-----------+------------+
|2016-12-14|     0|          0|   0|         14|           0|
|2016-12-14|     0|          0|   0|         14|           0|
|2016-12-14|     0|          0|   0|         18|           0|
|2016-12-14|     0|          0|   0|         19|           0|
|2016-12-14|     0|          0|   0|         20|           0|
|2016-12-14|     0|          0|   0|         26|           0|
|2016-12-14|     0|          0|   0|         60|           0|
|2016-12-14|     0|          0|   0|         63|           0|
|2016-12-14|     0|          0|   0|         78|           0|
|2016-12-14|     0|          0|   0|         90|           0|
+----------+------+-----------+----+-----------+------------+

问题是他们的日期总是一样的,所以我想做一些计数,然后在我们接近不同的日子时重新计数。

我写了一个 Pandas UDF 函数:

@pandas_udf('int', PandasUDFType.SCALAR)
def get_counts_up(v):
  prev = None
  series = []
  count = 0
  for i in v:
    if prev != i:
      count = 0
      prev = i
    series.append(count)
    count += 1
  return pd.Series(series)

但是,输出似乎不是连续的:

sdf.filter(sdf.Date == "2016-12-14").sort("Date_Count").show()

+------------+----------+------+-----------+----+-----------+------------+---------+----------+--------+----------+-----+----------+
|Date_Convert|      Date|column|column_____|col_|column_____|column______|Date_Year|Date_Month|Date_Day|Date_Epoch|count|Date_Count|
+------------+----------+------+-----------+----+-----------+------------+---------+----------+--------+----------+-----+----------+
|  2016-12-14|2016-12-14|     0|          0|   0|         14|           0|     2016|        12|      14|1481673600|14504|         0|
|  2016-12-14|2016-12-14|     0|          0|   0|         18|           0|     2016|        12|      14|1481673600|14504|         0|
|  2016-12-14|2016-12-14|     0|          0|   0|         14|           0|     2016|        12|      14|1481673600|14504|         1|
|  2016-12-14|2016-12-14|     0|          0|   0|         18|           0|     2016|        12|      14|1481673600|14504|         1|
|  2016-12-14|2016-12-14|     0|          0|   0|         18|           0|     2016|        12|      14|1481673600|14504|         2|
|  2016-12-14|2016-12-14|     0|          0|   0|         14|           0|     2016|        12|      14|1481673600|14504|         2|
|  2016-12-14|2016-12-14|     0|          0|   0|         14|           0|     2016|        12|      14|1481673600|14504|         3|
+------------+----------+------+-----------+----+-----------+------------+---------+----------+--------+----------+-----+----------+

这是意料之中的,因为我猜数据框被分成不同的机器(DataBrick 社区版中的一些机器),并且每个机器都有自己的数组要维护。

有没有办法进行连续计数?

【问题讨论】:

    标签: python pandas apache-spark pyspark


    【解决方案1】:

    Windowrow_number 函数的组合应该可以为您解决这个问题。正如您所说,我已使用所有列进行排序

    同一月份任何列的值都在增加的数据集...

    但您只能使用一列或多列具有递增值的列。

    from pyspark.sql import window as w
    windowSpec = w.Window.partitionBy("Date").orderBy("column", "column_2", "co_3", "column_4", "column_5")
    
    from pyspark.sql import functions as f
    df.withColumn('inc_count', f.row_number().over(windowSpec)).show(truncate=False)
    

    这应该给你

    +----------+------+--------+----+--------+--------+---------+
    |Date      |column|column_2|co_3|column_4|column_5|inc_count|
    +----------+------+--------+----+--------+--------+---------+
    |2016-12-14|0     |0       |0   |14      |0       |1        |
    |2016-12-14|0     |0       |0   |14      |0       |2        |
    |2016-12-14|0     |0       |0   |18      |0       |3        |
    |2016-12-14|0     |0       |0   |19      |0       |4        |
    |2016-12-14|0     |0       |0   |20      |0       |5        |
    |2016-12-14|0     |0       |0   |26      |0       |6        |
    |2016-12-14|0     |0       |0   |60      |0       |7        |
    |2016-12-14|0     |0       |0   |63      |0       |8        |
    |2016-12-14|0     |0       |0   |78      |0       |9        |
    |2016-12-14|0     |0       |0   |90      |0       |10       |
    +----------+------+--------+----+--------+--------+---------+
    

    【讨论】:

      猜你喜欢
      • 2021-07-06
      • 1970-01-01
      • 2022-10-17
      • 1970-01-01
      • 2021-05-16
      • 2021-08-13
      • 2019-02-23
      • 2021-08-13
      • 2019-02-26
      相关资源
      最近更新 更多