每章中最常见的 3 元组
现在我们将在更大的查询中把一个查询作为子查询使用。Spark SQL 支持 SQL 的高级特性。此前,您已经学过如何在包含 12 章的整本书中找出最常见的词序列。现在,您将为这 12 章中的每一章分别找出出现频率最高的 3 元组。您将使用窗口函数来获取每个分组的首行。
有一张包含 word、id、chapter 三列的表。
chapter列表示章的编号。word列表示文档中的单个词。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()