【问题标题】:How to order nested list with pyspark如何使用 pyspark 订购嵌套列表
【发布时间】:2022-06-13 18:05:48
【问题描述】:

如何使用 pyspark 对该数据框中的图书列表进行排序

root
 |-- AUTHORID: integer
 |-- NAME: string 
 |-- BOOK_LIST: array 
 |    |-- BOOK_ID: integer 
 |    |-- BOOK_NAME: string 

更新

就我而言,我有一个数据框,其中包含多个级别的嵌套项

root
  |-- AUTHOR_ID: integer (nullable = false)
  |-- NAME: string (nullable = true)
  |-- Books: array (nullable = false)
  |    |-- element: struct (containsNull = false)
  |    |    |-- BOOK_ID: integer (nullable = false)
  |    |    |-- Chapters: array (nullable = true) 
  |    |    |    |-- element: struct (containsNull = true)
  |    |    |    |    |-- NAME: string (nullable = true)
  |    |    |    |    |-- NUMBER_PAGES: integer (nullable = true)

如何按名称对章节进行排序?

【问题讨论】:

  • 对于更新的架构,我认为此时您应该 explode 数组并排序,然后将其组合回来。
  • @Emma 我们可以将array_sort 用于第一级项目,对于其他我应用array_sort 的项目就在.agg() 之后

标签: apache-spark pyspark


【解决方案1】:

如果您想通过BOOK_ID 订购并且BOOK_ID 是唯一字段,则可以使用array_sort

df = df.withColumn('BOOK_LIST', F.array_sort('BOOK_LIST')) 

请注意,array_sort 将仅按数组中的 1 列排序,在此示例中仅 BOOK_ID。

【讨论】:

  • 有没有办法使用array_sort基于+多于1列进行排序?
  • 我不这么认为。 array_sort 仅在您的数组包含 1 个元素或数组中的第一个元素时才有效(在您的情况下为 BOOK_ID。)。如果您想对章节中的BOOK_IDNAME 进行排序,我最好的选择是最后对explode 嵌套数组和排序/聚合(可能是窗口函数)。在这种情况下不要应用array_sort。一旦你爆炸,无论如何你都需要sort 在基于 2 列的行上。
【解决方案2】:

创建数据框并使用排序

     from pyspark.sql.functions import *
      df.sort(asc("BOOK_ID")).collect()

如果查看代码示例,请添加示例数据 json

【讨论】:

  • BOOK_ID 不在第一级,这里有一堆书!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-12-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-04
相关资源
最近更新 更多