我一直在尝试从看起来像这样的表格中找到一个流行的主题标签。
| Tweet_id | Hashtags |
-----------------------------------------------------
| id1 | [hashtag1,hashtag2,hashtag3] |
| id2 | [hashtag2,hashtag4] |
| id3 | [] |
| id4 | [hashtag1] |
所以我尝试使用 MySQL
查询从表中打印最常出现的主题标签。根据我对此所做的研究,我只能使用FIND_IN_SET
检索单个主题标签。但可以看出,列中的主题标签数量与行不同。我的查询必须搜索数组中的所有主题标签并生成结果。
注意: 我真正在做的是,我有一个 json 文件,并且我正在使用 Sparks sqlContext 来转换 json 并将其注册为表。该表如上所示。我正在使用 sqlContext.sql("//sqlquery//") 来从这些表中检索数据。
更新:- 这是架构
root
|-- hashtag: array (nullable = true)
| |-- element: string (containsNull = true)
最佳答案
您可以拆分和计数:
SELECT sub.val AS `HashTag`, COUNT(*) AS `count`
FROM
(
SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(t.HashTag, ',', n.n), ',', -1) AS val
FROM (SELECT Substring(HashTag, 2, LENGTH(HashTag) - 2) AS HashTag FROM tab) AS t
CROSS JOIN
(
SELECT a.N + b.N * 10 + 1 n
FROM
(SELECT 0 AS N UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) a
,(SELECT 0 AS N UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) b
) n
WHERE n.n <= 1 + (LENGTH(t.HashTag) - LENGTH(REPLACE(t.HashTag, ',', '')))
) sub
WHERE val <> ''
GROUP BY sub.val
ORDER BY `count` DESC
-- LIMIT 1;
输出:
╔═══════════╦═══════╗
║ val ║ count ║
╠═══════════╬═══════╣
║ hashtag1 ║ 2 ║
║ hashtag2 ║ 2 ║
║ hashtag4 ║ 1 ║
║ hashtag3 ║ 1 ║
╚═══════════╩═══════╝
无论如何,你应该规范你的表。
关于mysql - 用于从列中了解流行主题标签的 SQL 查询,该列具有存储为数组的主题标签列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34040402/