开始使用免费开始使用

每章中最常见的 3 元组

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

有一张包含 wordidchapter 三列的表。

  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() 为每章的每一行生成行号。

本练习是课程的一部分

Python 中的 Spark SQL 入门

查看课程

练习说明

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

交互式实操练习

通过完成这段示例代码来试试这个练习。

#   Most frequent 3-tuple per chapter
query = """
SELECT chapter, w1, w2, w3, count FROM
(
  SELECT
  chapter,
  ____() OVER (PARTITION BY chapter ORDER BY ____ DESC) AS row,
  w1, w2, w3, count
  FROM ( %s )
)
WHERE row = ____
ORDER BY chapter ASC
""" % subquery

spark.sql(query).show()
编辑并运行代码