1. Learn
  2. /
  3. 课程
  4. /
  5. Python 中的 Spark SQL 入门

Connected

道练习

每章中最常见的 3 元组

现在我们将在更大的查询中把一个查询作为子查询使用。Spark SQL 支持 SQL 的高级特性。此前,您已经学过如何在包含 12 章的整本书中找出最常见的词序列。现在,您将为这 12 章中的每一章分别找出出现频率最高的 3 元组。您将使用窗口函数来获取每个分组的首行。

有一张包含 word、id、chapter 三列的表。

  1. chapter 列表示章的编号。
  2. word 列表示文档中的单个词。
  3. id 列表示该词在文档中的位置。

我们还有如下查询:

subquery = """
SELECT chapter, w1, w2, w3, COUNT(*) as count
FROM
(
    SELECT
    chapter,
    word AS w1,
    LEAD(word, 1) OVER(PARTITION BY chapter ORDER BY id ) AS w2,
    LEAD(word, 2) OVER(PARTITION BY chapter ORDER BY id ) AS w3
    FROM text
)
GROUP BY chapter, w1, w2, w3
ORDER BY chapter, count DESC
"""
spark.sql(subquery).show(5)
+-------+---+-----+----+-----+
|chapter| w1|   w2|  w3|count|
+-------+---+-----+----+-----+
|      1| up|   to| the|    6|
|      1|one|   of| the|    6|
|      1| in|front|  of|    5|
|      1| up|  and|down|    5|
|      1| it|  was|   a|    5|
+-------+---+-----+----+-----+
only showing top 5 rows

从该表可以看出,期望结果的第一行将是:

+-------+---+-----+----+-----+
|chapter| w1|   w2|  w3|count|
+-------+---+-----+----+-----+
|      1| up|   to| the|    6|
+-------+---+-----+----+-----+

您的任务是将 subquery 作为子查询嵌入更大的查询中,得到每章中最常见的 3 元组。期望结果与当前模式相同,但每章只有一行。请使用 ROW_NUMBER() 为每章的每一行生成行号。

说明

100 XP
  • 获取每章中最常见的 3 元组。