2015-12-02 46 views
1

我一直在試圖從類似這樣的表中找到流行的哈希標籤。用於瞭解來自列的流行哈希標籤的SQL查詢,該列具有作爲數組存儲的哈希標籤列表

| Tweet_id |     Hashtags    | 
----------------------------------------------------- 
| id1 | [hashtag1,hashtag2,hashtag3]   | 
| id2 | [hashtag2,hashtag4]      | 
| id3 | []          | 
| id4 | [hashtag1]        |        

,所以我試圖打印從表中使用MySQL查詢最頂層的發生井號標籤。從我在這方面完成的研究中,我能夠使用FIND_IN_SET檢索到一個單一的hashtag。但是可以看出,列中的標籤數量對於行是不同的。我的查詢必須搜索數組中的所有hashtags並生成結果。

注意: 我真的在做的是我有一個json文件,我使用sparks sqlContext轉換json並將其註冊爲表格。表格看起來像上面那樣。我正在使用sqlContext.sql("//sqlquery//")從這些表中檢索數據。

更新: - 這是架構

root 
|-- hashtag: array (nullable = true) 
|  |-- element: string (containsNull = true) 
+3

如果可能,更改表結構,從不以逗號分隔形式存儲數據 –

+0

嘿,感謝您的快速回復..我不應該更改表結構。這是我的教授在我的項目中提出的條件之一。 – ArCh3r

+0

你可以顯示'printSchema'的輸出嗎? – zero323

回答

2

您可以分割和計數:

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; 

SqlFiddleDemo

輸出:

╔═══════════╦═══════╗ 
║ val  ║ count ║ 
╠═══════════╬═══════╣ 
║ hashtag1 ║  2 ║ 
║ hashtag2 ║  2 ║ 
║ hashtag4 ║  1 ║ 
║ hashtag3 ║  1 ║ 
╚═══════════╩═══════╝ 

無論如何,你應該規範你的表。

+0

嘿,謝謝你的回答,這是我所需要的。我沒有在我的火星殼中檢查它。但它看起來像它的工作。 – ArCh3r

+0

我真的懷疑OP的教授打算讓學生想出類似的東西!同意,規範化表格是一種方法。 @ ArCh3r,請仔細閱讀progfessor對你答案的約束,我懷疑你誤解了他們。 –