每章最常見的 3 元組
現在要在一個較大的查詢中使用子查詢。Spark SQL 支援進階 SQL 功能。你先前已學過如何在包含 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 元組。目標結果的綱要(schema)相同,但每章只會有一列。請使用 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()