Наиболее частые 3-граммы по главам
Теперь мы используем запрос в качестве подзапроса в более крупном запросе. Spark SQL поддерживает расширенные возможности SQL. Ранее вы научились находить наиболее распространённые последовательности слов по всей книге из 12 глав. Теперь вы найдёте наиболее частую 3-грамму для каждой из 12 глав. Для этого используйте оконную функцию, чтобы получить первую строку в каждой группе.
В таблице есть столбцы 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(), чтобы получить номер строки для каждой строки в каждой главе.
Это упражнение является частью курса
Введение в Spark SQL на Python
Инструкции к упражнению
- Получите наиболее частую 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()