오픈소스

Eventsim으로 생성한 로그데이터로 SuperSet으로 시각화하기(1)

JMDev 2023. 11. 19. 00:41

https://park-dev-diary.tistory.com/21

 

Eventsim 빌드 및 실행하기

이 모든 과정은 MacOS 기준을 작성되었습니다! 1. JAVA 설치하기 터미널에서 java -version 명령어로 설치되었는지 확인 후 없다면 아래 사이트를 참고하여 설치하면 좋을 것 같습니다. https://llighter.gith

park-dev-diary.tistory.com

위 포스팅에서 Eventsim를 빌드하는 과정을 정리해본 적이 있다.

이 Eventsim를 활용하면 수천만개의 음악사이트 유저들의 로그들을 생성할 수 있다.

 

몇몇 생성된 로그데이터들을 아래와 같은 형식으로 나타난다.

{"ts":1433116803000,"userId":"8932","sessionId":8339,"page":"NextSong","auth":"Logged In","method":"PUT","status":200,"level":"paid","itemInSession":11,"location":"Washington-Arlington-Alexandria, DC-VA-MD-WV","userAgent":"\"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.143 Safari/537.36\"","lastName":"Adams","firstName":"Jacob","registration":1426041922000,"gender":"M","tag":"test","artist":"Weezer","song":"Island In The Sun","length":199.94077}
{"ts":1433116803000,"userId":"6332","sessionId":996,"page":"NextSong","auth":"Logged In","method":"PUT","status":200,"level":"free","itemInSession":0,"location":"Philadelphia-Camden-Wilmington, PA-NJ-DE-MD","userAgent":"\"Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.125 Safari/537.36\"","lastName":"Harris","firstName":"Dustyn","registration":1432087788000,"gender":"M","tag":"test","artist":"Royksopp","song":"You Don't Have A Clue","length":275.48689}
{"ts":1433116823000,"userId":"10135","sessionId":4799,"page":"NextSong","auth":"Logged In","method":"PUT","status":200,"level":"paid","itemInSession":13,"location":"Dallas-Fort Worth-Arlington, TX","userAgent":"\"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2062.103 Safari/537.36\"","lastName":"Noble","firstName":"Jaelyn","registration":1430386583000,"gender":"F","tag":"test","artist":"Coldplay","song":"Yellow","length":268.30322}

 

위 데이터들을 정리하자면 이렇다.

  • ts: 타임스탬프, 이벤트 발생 시간
  • userId: 사용자의 고유 식별자.
  • sessionId: 세션의 고유 식별자, 하나의 세션은 여러 이벤트
  • page: 사용자가 방문한 페이지의 종류
  • auth: 사용자의 인증 상태
  • method: HTTP 메소드
  • status: HTTP 상태 코드
  • level: 사용자의 구독 레벨
  • itemInSession: 세션 내의 이벤트 순서
  • location: 사용자의 지리적 위치
  • userAgent: 사용자의 브라우저와 운영체제 정보
  • lastName: 사용자의 성
  • firstName: 사용자의 이름
  • registration: 사용자의 가입 시간을 나타내는 타임스탬프
  • gender: 사용자의 성별
  • tag: 추가적인 태그 정보
  • artist: 재생된 음악의 아티스트
  • song: 재생된 음악의 제목
  • length: 음악의 길이(초 단위)

 

위 데이터들을 통해 유의미한 시각화 자료를 만들 수 있을 것 같다.

 

1.  사용자의 지역별 플레이한 음악 시각화( Map )

location를 통해 각 지역에서 사용자들의 플레이한 음악을 통계내어 시각화 자료로 표현할 수 있을 것 같다.

 

2. 시간별 유저들의 플레이한 음악 카운트( Bar )

ts와 userId를 통해, 몇시에 가장 많이 음악을 플레이를 하는지에 대해 시각화 자료로 표현해볼 수 있을 것 같다.

 

3. 가장 많이 들은 아티스트의 여성,남성의 비율( 테이블 )

artist 기준으로 group by하여 그 중 여성과 남성의 비율을 체크하여 이를 시각화 자료로 표현해볼 수 있을 것 같다.

 

이렇게 작업을 계획하고 시작했다. 그리고 위 데이터들이 시각화되기 위해서는 데이터베이스로 옮겨야 하는 작업이 필요하다.

여기에서 사용된 데이터베이스는 MySQL를 사용하였고, Docker로 이미지로 빌드하였다.

 

위에서 생성된 로그.json 를 MySQL를 넣기 위해서, Python의 Pandas를 활용해 MySQL에 INSERT 작업을 해주었습니다.

 

import pandas as pd
from sqlalchemy import create_engine, types
import time

# 시작 시간 기록
start_time = time.time()

# JSON 파일 로드
file_path = 'test.data.json'  # JSON 파일 경로
df = pd.read_json(file_path, lines=True)

# 데이터 정제 및 전처리 (예시)
# df['new_column'] = df['existing_column'].apply(some_function)  # 새로운 컬럼 추가 또는 변환

# MySQL 데이터베이스 연결
database_username = 'root'
database_password = 'my-secret-pw'
database_ip       = 'localhost'
database_name     = 'mydatabase'
database_connection = create_engine(f'mysql+pymysql://{database_username}:{database_password}@{database_ip}/{database_name}')

table_name = 'user_song_count'


dtype={
    'ts': types.BigInteger,
    'userId': types.VARCHAR(length=255),
    'sessionId': types.Integer,
    'page': types.VARCHAR(length=255),
    'auth': types.VARCHAR(length=255),
    'method': types.VARCHAR(length=255),
    'status': types.Integer,
    'level': types.VARCHAR(length=255),
    'itemInSession': types.Integer,
    'location': types.VARCHAR(length=255),
    'userAgent': types.VARCHAR(length=255),
    'lastName': types.VARCHAR(length=255),
    'firstName': types.VARCHAR(length=255),
    'registration': types.BigInteger,
    'gender': types.VARCHAR(length=255),
    'tag': types.VARCHAR(length=255),
    'artist': types.VARCHAR(length=255),
    'song': types.VARCHAR(length=255),
    'length': types.Float
}

# 데이터베이스에 데이터 저장
try:
    df.to_sql(con=database_connection, name=table_name, if_exists='replace', index=False, dtype=dtype)  # dtype에 각 컬럼의 데이터 타입 지정
    print("Data successfully saved to database.")
except Exception as e:
    print(f"Error occurred: {e}")

# 실행 완료 후 경과 시간 출력
end_time = time.time()
print(f"Time taken: {end_time - start_time} seconds")

 

 

위 작업으로 Pandas를 활용하여 MySQL에 Eventsim의 데이터들을 마이그레이션(?)이 되었다면,

 

Superset를 활용하여 시각화작업을 진행해볼 수 있을 것 같습니다.

시각화하는 방법은 다음에 진행해보겠습니다!