PySpark:在DataFrame中的小组内迭代



我试图了解如何在PySpark DataFrame中进行小组内操作。假设我有以下模式的DF:

root
|-- first_id: string (nullable = true)
|-- second_id_struct: struct (nullable = true)
|    |-- s_id: string (nullable = true)
|    |-- s_id_2: int (nullable = true)
|-- depth_from: float (nullable = true)
|-- depth_to: float (nullable = true)
|-- total_depth: float (nullable = true) 

所以数据可能看起来像这样:

我想:

  1. 按first_id
  2. 分组数据
  3. ,按s_id_2升序排序
  4. 在struct或根DataFrame中添加额外的列layer,以指示s_id_2在组中的顺序。

例如:

first_id | second_id | second_id_order 
---------| --------- | ---------------
      A1 |   [B, 10] | 1  
---------| --------- | ---------------
      A1 |   [B, 14] | 2
---------| --------- | ---------------
      A1 |   [B, 22] | 3
---------| --------- | ---------------
      A5 |    [A, 1] | 1
---------| --------- | ---------------
      A5 |    [A, 7] | 2
---------| --------- | ---------------
      A7 |      null | 1
---------| --------- | ---------------        

一旦分组,每个first_id最多有4个second_id_struct。我该如何处理这类问题?

我对如何在dataframe的小组(1-40行)内进行迭代操作特别感兴趣,其中组内列的顺序很重要。

谢谢!

创建一个DataFrame

d = [{'first_id': 'A1', 'second_id': ['B',10]}, {'first_id': 'A1', 'second_id': ['B',14]},{'first_id': 'A1', 'second_id': ['B',22]},{'first_id': 'A5', 'second_id': ['A',1]},{'first_id': 'A5', 'second_id': ['A',7]}]
df = sqlContext.createDataFrame(d) 

可以看到结构

df.printSchema()
|-- first_id: string (nullable = true)
|-- second_id: array (nullable = true)
|........|-- element: string (containsNull = true)
df.show()
+--------+----------+
|first_id|second_id |
+--------+----------+
|      A1|   [B, 10]|
|      A1|   [B, 14]|
|      A1|   [B, 22]|
|      A5|    [A, 1]|
|      A5|    [A, 7]|
+--------+----------+

则可以使用dense_rankWindow函数显示子组中的顺序。与SQL中的over partition相同。

窗口函数介绍:Spark SQL中的窗口函数介绍

代码:

# setting a window spec
windowSpec = Window.partitionBy('first_id').orderBy(df.second_id[1])
# apply dense_rank to the window spec
df.select(df.first_id, df.second_id, dense_rank().over(windowSpec).alias("second_id_order")).show()
结果:

+--------+---------+---------------+
|first_id|second_id|second_id_order|
+--------+---------+---------------+
|      A1|  [B, 10]|              1|
|      A1|  [B, 14]|              2|
|      A1|  [B, 22]|              3|
|      A5|   [A, 1]|              1|
|      A5|   [A, 7]|              2|
+--------+---------+---------------+

相关内容

  • 没有找到相关文章