AWS 서버리스 람다 예약 이벤트를 통해 트윗을 CouchBase에 저장하기 에서 AWS 서버리스 람다를 사용해 Couchbase에 트윗을 저장하는 방법을 설명했습니다. 이제 이 람다 함수는 며칠 동안 실행되어 다음에서 269개의 트윗을 수집했습니다. 리얼도널드트럼프. 이 블로그는 다음에서 영감을 받았습니다. 트위터의 SQL: N1QL을 사용한 손쉬운 분석에서는 N1QL을 사용하여 이러한 트윗을 분석하는 방법을 보여줍니다.
N1QL 의 SQL과 유사한 쿼리 언어입니다. 카우치베이스 JSON 문서에서 작동합니다. N1QL과 SQL의 차이점 는 N1QL과 SQL의 차이점을 설명합니다. N1QL을 사용하여 다음과 같은 흥미로운 정보를 공개해 보겠습니다. 리얼도널드트럼프의 트윗을 확인하세요. 다음 분들께 감사드립니다. N1QL 팀의 Sitaram 를 사용하여 쿼리를 해킹할 수 있습니다.
트윗 수
첫 번째 쿼리는 데이터베이스에 얼마나 많은 트윗이 있는지 확인하는 것입니다. 쿼리는 매우 간단합니다: 쿼리:
|
1 2 |
선택 COUNT(*) 트윗_수 FROM 트위터; |
보시다시피 구문은 SQL과 매우 유사합니다. 선택, COUNT 그리고 FROM 절은 SQL 구문에서 이미 익숙한 것입니다. 트윗_수 는 반환된 결과에 대해 정의된 별칭입니다. 트위터 는 모든 JSON 문서가 저장되는 버킷입니다. 결과:
|
1 2 3 4 5 |
[ { "트윗_수": 269 } ] |
결과도 JSON 문서가 됩니다.
트윗 샘플 JSON 문서
JSON 문서에 쿼리를 작성하려면 문서의 구조를 알아야 합니다. 다음 쿼리를 통해 이를 알 수 있습니다. 쿼리:
|
1 2 3 |
선택 * FROM 트위터 LIMIT 1; |
여기에 도입된 새로운 조항은 다음과 같습니다. LIMIT. 이를 통해 결과 집합에서 반환되는 객체의 수를 제한할 수 있습니다. 선택. 결과:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 |
[ { "twitter": { "accessLevel": "0", "기여자": [], "createdAt": "1480828438000", "currentUserRetweetId": "-1", "displayTextRangeEnd": "-1", "displayTextRangeStart": "-1", "favoriteCount": "116356", "즐겨찾기": false, "geoLocation": null, "해시태그 엔티티": [], "id": "805278955150471168", "inReplyToScreenName": null, "inReplyToStatusId": "-1", "inReplyToUserId": "-1", "lang": "en", "미디어 엔티티": [], "장소": null, "아마도 민감": false, "quotedStatus": null, "quotedStatusId": "-1", "rateLimitStatus": null, "리트윗": false, "retweetCount": "28330", "리트윗": false, "retweetedByMe": false, "retweetedStatus": null, "범위": null, "source": "<a href="http://twitter.com/download/android" rel="nofollow">안드로이드용 트위터</a>", "symbolEntities": [], "text": "방금 '새터데이 나이트 라이브'를 시청해봤는데 시청할 수 없었어요! 완전히 편향적이고 재미없고 볼드윈 성대모사는 이보다 더 나쁠 수 없습니다. 슬프다", "잘린": false, "urlentities": [], "user": { "accessLevel": "0", "큰프로필이미지URL": "http://pbs.twimg.com/profile_images/1980294624/DJT_Headshot_V2_bigger.jpg", "큰프로필이미지URLHttps": "https://pbs.twimg.com/profile_images/1980294624/DJT_Headshot_V2_bigger.jpg", "기여자 사용": false, "createdAt": "1237383998000", "defaultProfile": false, "기본 프로필 이미지": false, "설명": "미국 대통령 당선인", "descriptionURLEntities": [], "이메일": null, "favouritesCount": "46", "followRequestSent": false, "팔로워 수": "19294404", "friendsCount": "42", "geoEnabled": true, "id": "25073877", "lang": "en", "listedCount": "52499", "위치": "뉴욕, 뉴욕", "미니프로필이미지URL": "http://pbs.twimg.com/profile_images/1980294624/DJT_Headshot_V2_mini.jpg", "미니프로필이미지URLHttps": "https://pbs.twimg.com/profile_images/1980294624/DJT_Headshot_V2_mini.jpg", "name": "도널드 J. 트럼프", "원래프로필이미지URL": "http://pbs.twimg.com/profile_images/1980294624/DJT_Headshot_V2.jpg", "원래프로필이미지URLHttps": "https://pbs.twimg.com/profile_images/1980294624/DJT_Headshot_V2.jpg", "profileBackgroundColor": "6D5C18", "profileBackgroundImageURL": "http://pbs.twimg.com/profile_background_images/530021613/trump_scotland__43_of_70_cc.jpg", "profileBackgroundImageUrlHttps": "https://pbs.twimg.com/profile_background_images/530021613/trump_scotland__43_of_70_cc.jpg", "profileBackgroundTiled": true, "profileBannerIPadRetinaURL": "https://pbs.twimg.com/profile_banners/25073877/1479776952/ipad_retina", "profileBannerIPadURL": "https://pbs.twimg.com/profile_banners/25073877/1479776952/ipad", "profileBannerMobileRetinaURL": "https://pbs.twimg.com/profile_banners/25073877/1479776952/mobile_retina", "profileBannerMobileURL": "https://pbs.twimg.com/profile_banners/25073877/1479776952/mobile", "profileBannerRetinaURL": "https://pbs.twimg.com/profile_banners/25073877/1479776952/web_retina", "profileBannerURL": "https://pbs.twimg.com/profile_banners/25073877/1479776952/web", "profileImageURL": "http://pbs.twimg.com/profile_images/1980294624/DJT_Headshot_V2_normal.jpg", "profileImageURLHttps": "https://pbs.twimg.com/profile_images/1980294624/DJT_Headshot_V2_normal.jpg", "profileLinkColor": "0D5B73", "profileSidebarBorderColor": "BDDCAD", "profileSidebarFillColor": "C5CEC0", "profileTextColor": "333333", "profileUseBackgroundImage": true, "protected": false, "rateLimitStatus": null, "화면 이름": "realDonaldTrump", "showAllInlineMedia": false, "status": null, "statusesCount": "34269", "시간대": "동부 표준시(미국 및 캐나다)", "번역기": false, "url": "https://t.co/mZB2hymxC9", "urlentity": { "displayURL": "https://t.co/mZB2hymxC9", "end": "23", "확장URL": "https://t.co/mZB2hymxC9", "시작": "0", "text": "https://t.co/mZB2hymxC9", "url": "https://t.co/mZB2hymxC9" }, "utcOffset": "-18000", "검증된": true, "withheldInCountries": null }, "사용자 멘션 엔티티": [], "withheldInCountries": null } } ] |
트윗 상위 5일
기본적인 쿼리가 끝나면 이제 몇 가지 흥미로운 데이터를 살펴보겠습니다. 상위 5일 중 리얼도널드트럼프 트윗한 트윗 수와 트윗 횟수는? 쿼리:
|
1 2 3 4 5 6 |
선택 SUBSTR(MILLIS_TO_STR(TO_NUM(createdAt)), 0, 10) 트윗_날짜, COUNT(1) 트윗_수 FROM 트위터 그룹 BY SUBSTR(MILLIS_TO_STR(TO_NUM(createdAt)), 0, 10) 주문 BY COUNT(1) DESC LIMIT 5; |
보통 그룹 기준 그리고 주문 기준 SQL 절은 동일한 기능을 수행합니다. N1QL 기능 값에 함수를 적용합니다. 값에 createdAt 필드에 숫자를 문자열로 반환합니다. TO_NUM 함수는 문자열을 숫자로 변환합니다. MILLIS_TO_STR 함수는 문자열을 날짜로 변환합니다. 마지막으로 SUBSTR 함수는 날짜의 관련 부분을 추출합니다. 결과:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
[ { "트윗_수": 13, "트윗_날짜": "2017-01-17" }, { "트윗_수": 12, "트윗_날짜": "2017-01-06" }, { "트윗_수": 11, "트윗_날짜": "2016-12-04" }, { "트윗_수": 10, "트윗_날짜": "2017-01-03" }, { "트윗_수": 10, "트윗_날짜": "2017-01-04" } ] |
2017년 1월 17일이 가장 많이 트윗된 날입니다. 물론 이 결과는 데이터베이스에 저장된 JSON 문서의 데이터에 국한된 것입니다. 더 포괄적인 @realDonaldTrump 트윗 데이터베이스를 가지고 계신 분 있나요?
트윗 빈도
좋아요, 데이터베이스에 따르면 하루 최대 트윗 수는 13건입니다. 리얼도널드트럼프가 특정 날짜에 트윗한 횟수를 확인하려면 어떻게 해야 하나요? 쿼리:
|
1 2 3 4 5 6 7 8 |
선택 a.트윗_수, 카운트(1) 일수 FROM ( 선택 SUBSTR(millis_to_str(to_num(createdAt)), 0, 10) 트윗_날짜, COUNT(1) 트윗_수 FROM 트위터 그룹 BY SUBSTR(millis_to_str(to_num(createdAt)), 0, 10) ) a 그룹 BY a.트윗_수 주문 BY a.트윗_수 DESC; |
이 작업은 다음을 사용하여 쉽게 수행할 수 있습니다. N1QL 중첩 쿼리. 결과:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 |
[ { "days": 1, "트윗_수": 13 }, { "days": 1, "트윗_수": 12 }, { "days": 1, "트윗_수": 11 }, { "days": 2, "트윗_수": 10 }, { "days": 1, "트윗_수": 9 }, { "days": 7, "트윗_수": 8 }, { "days": 3, "트윗_수": 7 }, { "days": 7, "트윗_수": 6 }, { "days": 5, "트윗_수": 5 }, { "days": 5, "트윗_수": 4 }, { "days": 11, "트윗_수": 3 }, { "days": 3, "트윗_수": 2 }, { "days": 1, "트윗_수": 1 } ] |
47일 동안 트윗이 단 한 건도 없는 날은 단 하루뿐입니다. 총 합계는 트윗_수 를 보면 트윗이 없는 날이 하루도 없다는 것을 알 수 있습니다 :)
하루 중 가장 많이 트윗하는 시간
리얼도널드트럼프는 다음과 같이 알려져 있습니다. 새벽 3시에 트윗하기. 그가 가장 많이 트윗하는 시간이 언제인지 살펴봅시다. 쿼리:
|
1 2 3 4 5 6 |
선택 SUBSTR(MILLIS_TO_STR(TO_NUM(createdAt)), 11, 2) 트윗_시간, COUNT(1) 트윗_수 FROM 트위터 그룹 BY SUBSTR(MILLIS_TO_STR(TO_NUM(createdAt)), 11, 2) 주문 BY 트윗_수 DESC LIMIT 5; |
결과:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
[ { "트윗_수": 39, "트윗_시간": "13" }, { "트윗_수": 27, "트윗_시간": "12" }, { "트윗_수": 26, "트윗_시간": "11" }, { "트윗_수": 20, "트윗_시간": "14" }, { "트윗_수": 15, "트윗_시간": "00" } ] |
이제 논란이 되는 트윗은 새벽 3시에 올라온 것 같습니다. 하지만 39개의 트윗은 점심 식사 직후 디저트를 먹고 있는 오후 1시(동부 표준시)에 올라오고 있습니다.
트윗할 일반적인 요일
트윗을 가장 많이 올리는 요일이 무엇인지 알아보세요. 쿼리:
|
1 2 3 4 5 |
선택 DATE_PART_STR(MILLIS_TO_STR(TO_NUM(createdAt)), "day_of_week") 요일_요일, COUNT(1) 트윗_수 FROM 트위터 그룹 BY DATE_PART_STR(MILLIS_TO_STR(TO_NUM(createdAt)), "day_of_week") 주문 BY 트윗_수 DESC; |
DATE_PART_STR 는 날짜의 일부를 반환하는 새로운 함수입니다. 추가 요일_요일 속성을 사용하여 요일을 가져옵니다. 결과:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
[ { "day_of_week": 2, "트윗_수": 49 }, { "day_of_week": 3, "트윗_수": 40 }, { "day_of_week": 0, "트윗_수": 40 }, { "day_of_week": 5, "트윗_수": 38 }, { "day_of_week": 4, "트윗_수": 36 }, { "day_of_week": 6, "트윗_수": 33 }, { "day_of_week": 1, "트윗_수": 33 } ] |
화요일이 가장 많이 트윗하는 날인 것 같습니다. 그 다음으로는 일요일과 수요일이 같은 수준입니다. 주말에 가까워질수록 실적이 떨어지는 경향이 있습니다.
#22417 는 평일 부분을 영어로 보고할 수 있어야 합니다.
트윗에서 언급된 상위 5개 멘션
쿼리:
|
1 2 3 4 5 6 |
선택 COUNT(1) user_count, ue.화면 이름 FROM 트위터 UNNEST 사용자 멘션 엔티티 ue 그룹 by ue.화면 이름 주문 by user_count DESC LIMIT 5; |
사용자 멘션 엔티티 는 JSON 문서의 중첩 배열입니다. UNNEST 는 개념적으로 중첩된 배열과 상위 객체의 조인을 수행합니다. 조인된 각 결과 객체는 쿼리의 입력이 됩니다. 결과:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
[ { "화면 이름": "realDonaldTrump", "user_count": 11 }, { "화면 이름": "FoxNews", "user_count": 7 }, { "화면 이름": "CNN", "user_count": 6 }, { "화면 이름": "NBCNews", "user_count": 5 }, { "화면 이름": "DanScavino", "user_count": 5 } ] |
말할 필요도 없이, 그는 트윗에서 자신의 이름을 가장 많이 언급합니다! 그리고 그가 가장 좋아하는 두 개의 TV 방송국 폭스 뉴스 그리고 CNN.
RT가 많은 트윗 상위 5개
람다 함수는 3시간마다 깨어나서 최신 트윗을 가져옵니다. 따라서 데이터베이스는 트윗과 RT 및 마음에 들어요와 같은 관련 정보의 스냅샷입니다. 따라서 트윗이 보관된 시점에 따라 RT 및 마음에 들어요가 정확하게 표시되지 않을 수 있습니다. 하지만 이 정보를 바탕으로 가장 많은 RT를 받은 트윗을 살펴봅시다. 쿼리:
|
1 2 3 4 |
선택 retweetCount, 텍스트 FROM 트위터 주문 BY retweetCount LIMIT 5; |
매우 간단한 쿼리입니다. 결과:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
[ { "retweetCount": "10110", "text": "미국 국민 여러분. 저는 우리가 함께 미국을 다시 위대하게 만들 것이라고 믿어 의심치 않습니다!" }, { "retweetCount": "10140", "text": "24시간 연중무휴로 지역사회를 보호하고 봉사하는 모든 분들께 감사드립니다! n#법집행 감사의 날... https://t.co/aqUbDipSgv" }, { "retweetCount": "10370", "text": "오늘 트럼프 타워에서 멋진 뉴스 컨퍼런스를 가졌습니다. 몇 개의 가짜 뉴스 조직이 참석했지만 사람들은 무슨 일이 일어나고 있는지 진정으로 이해했습니다." }, { "retweetCount": "10414", "text": "이 회사들은 세금이나 관세가 부과되지 않고 50개 주를 모두 이동할 수 있습니다. 미리 양해해 주시기 바랍니다..." }, { "retweetCount": "10416", "text": "누군가 DNC를 해킹했는데 왜 "해킹 방어"RNC처럼 왜 그들은 끔찍한......"에 대응하지 않았나요? } ] |
원본과 RT
작성된 트윗과 리트윗된 트윗은 몇 건인가요? 쿼리:
|
1 2 3 |
선택 리트윗, 카운트(1) 카운트 FROM 트위터 그룹 BY 리트윗; |
결과:
|
1 2 3 4 5 6 7 8 9 10 |
[ { "count": 253, "리트윗": false }, { "count": 15, "리트윗": true } ] |
대부분의 트윗은 리트윗이 거의 없는 원본 트윗입니다.
트윗에서 가장 많이 사용되는 단어
쿼리:
|
1 2 3 4 5 |
선택 COUNT(1) 카운트, 단어 FROM 트위터 UNNEST 분할(텍스트) 단어 그룹 BY 단어 주문 BY 카운트 DESC; |
이 쿼리는 다음을 사용합니다. 분할 함수의 결과입니다:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
[ { "count": 189, "단어": "the" }, { "count": 151, "단어": "to" }, { "count": 115, "단어": "and" }, . . . { "count": 1, "단어": "제시...트럼프의" }, { "count": 1, "단어": "일자리." }, { "count": 1, "단어": "수행 중" } ] |
트윗에서 '미디어', '가짜', '미국'이라는 단어의 사용 빈도
쿼리:
|
1 2 3 4 5 6 |
선택 COUNT(1) 카운트, LOWER(w) 단어 FROM 트위터 UNNEST 분할(텍스트) w 어디 LOWER(w) IN [ "미디어", "가짜", "미국"] 그룹 by LOWER(w) 주문 BY 카운트 DESC; |
LOWER 함수는 대소문자에 관계없이 단어를 비교하는 데 사용됩니다. 결과:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
[ { "count": 12, "단어": "미디어" }, { "count": 9, "단어": "가짜" }, { "count": 8, "단어": "미국" } ] |
람다 함수 는 계속해서 트윗을 데이터베이스에 저장합니다.
이 쿼리를 직접 사용해 보시겠습니까?
- Couchbase 서버 시작
- 아카이브 사용 twitter-backups-2017-01-20-06-07-49.tar 에서 설명한 대로 카우치베이스에 데이터 복원
- 사용 쿼리 워크벤치 를 사용하여 쿼리를 실행합니다.