일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- if문 작성법
- 순위출력
- 불순도제거
- sql
- merge
- 데이터분석
- 빅데이터
- %in%
- count
- 총과 카드만들기
- 팀스파르타
- loop 문
- 정보획득량
- 그래프시각화
- Dense_Rank
- max
- 그래프 생성 문법
- 회귀분석 알고리즘
- 막대그래프
- 데이터분석가
- 히스토그램 그리기
- 회귀분석
- Sum
- Intersect
- 단순회귀 분석
- difftime
- 빅데이터분석
- 여러 데이터 검색
- sqld
- 상관관계
- Today
- Total
ch0nny_log
[빅데이터분석] Linux_6. 몽고 디비(mongo db) 설치 및 운영관리 본문
■ centos 에 mongo db 설치
1. root 유져로 접속합니다.
2. 몽고 디비를 설치하기 위하여 아래의 파일을 열어서 아래의 내용을 입력합니다.
[root@centos ~]# vi /etc/yum.repos.d/mongodb-org-3.4.repo
3. 몽고디비를 설치합니다.
[root@centos ~]# yum install -y mongodb-org
4. 몽고디비를 시작 시킵니다.
[root@centos ~]# systemctl enable mongod
[root@centos ~]# systemctl start mongod
5. 몽고디비를 실행합니다.
[root@centos ~]# mongo
6. mongodb 에 emp 테이블을 생성합니다.
db.emp.save({empno:7499,ename:"SMITH",job:"CLERK",mgr:7902,hiredate:"1980-12-17",sal:1800,comm:800,deptno:20})
db.emp.save({empno:7369,ename:"ALLEN",job:"SALESMAN",mgr:7698,hiredate:"1981-02-20",sal:1600,comm:800,deptno:20})
db.emp.save({empno:7521,ename:"WARD",job:"SALESMAN",mgr:7698,hiredate:"1981-02-22",sal:1250,comm:500,deptno:30})
db.emp.save({empno:7566,ename:"JONES",job:"MANAGER",mgr:7839, hiredate:"1981-04-02",sal:2975,comm:0,deptno:20})
db.emp.save({empno:7654,ename:"MARTIN",job:"SALESMAN",mgr:7698,hiredate:"1981-09-28",sal:1250,comm:1400,deptno:30})
db.emp.save({empno:7698,ename:"BLAKE",job:"MANAGER",mgr:7839,hiredate:"1981-05-01",sal:2850,comm:0,deptno:30})
db.emp.save({empno:7782,ename:"CLARK",job:"MANAGER",mgr:7839,hiredate:"1981-06-09",sal:2450,comm:0,deptno:10})
db.emp.save({empno:7788,ename:"SCOTT",job:"ANALYST",mgr:7566,hiredate:"1987-04-19",sal:3000,comm:0,deptno:20})
db.emp.save({empno:7839,ename:"KING",job:"PRESIDENT",mgr:0,hiredate:"1981-11-17",sal:5000,comm:0,deptno:10})
db.emp.save({empno:7844,ename:"TURNER",job:"SALESMAN",mgr:7698,hiredate:"1981-09-08",sal:1500,comm:0,deptno:30})
db.emp.save({empno:7876,ename:"ADAMS",job:"CLERK",mgr:7788,hiredate:"1987-05-23",sal:1100, comm:0,deptno:20})
db.emp.save({empno:7900,ename:"JAMES",job:"CLERK",mgr:7698,hiredate:"1981-12-03",sal:950,comm:0,deptno:30})
db.emp.save({empno:7902,ename:"FORD",job:"ANALYST",mgr:7566,hiredate:"1981-12-03",sal:3500,comm:0,deptno:20})
db.emp.save({empno:7934,ename:"MILLER",job:"CLERK",mgr:7782,hiredate:"1982-01-23",sal:1300, comm:0,deptno:20})
7. emp 데이터를 count 합니다.
※ 몽고 디비를 편하게 사용할 수 있는 툴 설치하기
참고 링크
※ mongo DB 란?
mongo 와 db와의 합성어입니다.
mongo 의 뜻이 거대한(Humongous)의 줄임말
■ 하둡 생태계
hive, mongodb, pig, spark |
↑ |
하둡 hdfs 와 mapreduce |
■ 몽고디비 문법
db.테이블명.find(
{검색조건}.
{보고싶은 컬럼명 })
■ 몽고디비 연산자 총정리
몽고디비 | SQL | |
1. 비교 연산자 | $eq | = |
$gt | > | |
$gte | >= | |
$lte | < | |
$ne | <= | |
$lte | != | |
2. 논리 연산자 | $and | and |
$or | or | |
$not | not | |
3. 산술 연산자 | $add | + |
$substract | - | |
$multiply | * | |
$devide | / | |
$mod | mod |
■ 몽고디비에서 데이터 검색하기
예제1. 월급이 3000 이하인 사원들의 이름과 월급을 출력하시오 !
db.emp.find( {job: {$nin : ['SALESMAN','ANALYST']}}, {_id:0 , ename:1, sal:1, job:1} )
문제1. 직업이salesman인 사원들의 이름,직업을 출력하시오.
db.emp.find( {job : {$eq:'SALESMAN'}}, { _id: 0, ename:1, job:1})
문제2. 직업이 salesman이 아닌사원들의 이름,직업을 출력하시오,
db.emp.find( {job : {$ne:'SALESMAN'}}, { _id: 0, ename:1, job:1})
■ 몽고디비 연산자 총정리
SQL | 몽고디비 |
1. between .. and | $gte |
2. in |
$in / $nin |
3. like | /찾고자하는 문자/ 시작은 ^, 끝은 $ |
4. is null |
예제1. 월급이1000에서 3000사이인 사원들의 이름,월급을 출력하시오.
db.emp.find( {sal : {$gte:1000, $lte:3000}}, { _id: 0, ename:1, sal:1})
예제2. 직업이 SALESMAN, ANAYST 인 사원들의 이름과 월급을 출력하시오.
db.emp.find( {job : {$in:['SALESMAN','ANAYLST']}}, { _id: 0, ename:1, sal:1, job:1})
문제1. 부서번호가 10, 20번인 사원들의 이름, 월급, 부서번호를 출력하시오.
db.emp.find( {deptno : {$in:[10,20]}}, { _id: 0, ename:1, sal:1, deptno:1})
문제2. 부서번호가 10번, 20번이 아닌 사원들의 이름과 월급과 직업을 출력하시오!
db.emp.find( { deptno : { $nin : [ 10, 20 ] } }, { _id : 0 , ename : 1, sal : 1, job : 1 } )
문제3. 이름의 첫번째 철자가 S 로 시작하는 사원들의 이름과 월급을 출력하시오 !
db.emp.find( { ename : /^S/ }, { _id : 0, ename : 1, sal : 1 } )
설명: /찾고자하는 문자/
시작은 ^, 끝은 $
^S 는 S 로 시작하는것이고 S$ 는 S로 끝나는 것입니다.
문제4. 이름의 끝 글자가 T로 끝나는 사원들의 이름과 월금을 출력하시오.
db.emp.find( {ename: /T$/}, { _id: 0, ename:1, sal:1})
문제5. 이름에 m자를 포함하고 있는 사원들의 이름, 월급을 출력하시오
db.emp.find( {ename: /M/}, { _id: 0, ename:1, sal:1})
문제6. emp테이블을 drop 하시오
dm.emp.drop()
문제7. emp.csv로 몽고디비에 emp테이블을 생성하시오
[root@centos ~]# cat emp.csv | mongoimport --type csv -c emp --headerline --drop
db.emp.find()
문제8. 1996.csv를 리눅스 서버에 올리고 몽고디비의 테이블(collection)으로 생성하시오) _테이블명_ airline
cat /root/1996.csv | mongoimport --type csv -c airline --headerline --drop
db.airline.count()
문제9. 커미션이 null인 사원들의 이름과 커미션을 출력하시오
db.emp.find( { comm : { $ne : null } }, { _id : 0, ename :1, comm : 1 } )
■ 몽고디비에서 데이터 정렬
문제1. 이름과 월급을 출력하는데 월급이 높은 사원부터 출력하시오
1 은 ascending 이고 -1 은 descending 임db.emp.find( { } , { _id : 0, ename : 1, sal : 1 } ).sort( {sal : -1} )
문제2. 직업이 SALESMAN 인 사원들의 이름과 월급을 출력하는데 월급이 낮은 사원부터 높은 사원순으로 출력하시오
db.emp.find( { job : { $eq : "ANALYST"} } , { _id : 0, ename : 1, sal : 1 } ).sort( {sal : -1} )
■ 몽고디비에서 그룹함수 사용하기
문제1. 사원테이블에서 최대월급을 출력하시오.
db.emp.aggregate([{$group:{_id:0, 최대월급:{$max: "$sal"}}}])
문제2. 사원테이블에서 최소월급을 출력하시오.
db.emp.aggregate([{$group:{_id:0, 최소월급:{$min: "$sal"}}}])
문제3. 직업이 salesman 사원들 중에서 최소월급을 출력하시오
db.emp.aggregate([{$match:{ job:'CLERK'}}, {$group:{_id:0, 최소월급:{$min: "$sal"}}}])
문제 4. 부서번호가 30번인 사원들의 토탈월급을 출력하시오.
db.emp.aggregate([{$match:{ deptno:30}}, {$group:{_id:0, 토탈월급:{$sum: "$sal"}}}])
문제5. 부서번호, 부서번호별 토탈월급을 출력하시오
db.emp.aggregate([ {$group:{_id:'$deptno', 토탈월급:{$sum: "$sal"}}}])
문제6. 직업과 직업별 토탈월급을 출력하는데 직업별 토탈월급이 높은것 부터 출력하시오.
db.emp.aggregate( {$group:{_id:'$job', 토탈월급:{$sum: "$sal"}}}, {$sort: {'토탈월급':-1}})
문제7. 위의 결과를 다시 출력하는데 직업이 clerk은 제외하고 출력하시오
db.emp.aggregate( {$match:{job:{$ne:"CLERK"}}}, {$group:{_id:'$job', 토탈월급:{$sum: "$sal"}}}, {$sort: {'토탈월급':-1}})
문제8. 미국 항공 데이터 airline 테이블에서 월, 월별 출발 지연의 평균값을 출력하는데 출발 지연의 평균값이 높은 것 부터 출력하시오
db.airline.aggregate( {$group:{_id:'$Month', 평균지연:{$avg: "$DepDelay"}}}, {$sort: {'평균지연':-1}})
■ 몽고디비에서 count 함수
1. 테이블 | 테이블 |
2. 이미지 | 몽고디비(무료) |
몽고디비(무료) | 몽고디비(무료) |
4. 텍스트 | 감정분석, 자연어 처리 신경망 구성(쳇봇, 쳇GPT) |
5. 웹로그 | AB 테스트 결과 분석 |
문제1. 직업, 직업별 인원수를 출력하시오 !
db.emp.aggregate( { $group : { _id: "$job", 인원수: {$sum:1} } } )
※ 설명: 몽고디비는 SQL처럼 count 함수가 있는게 아니어서 sum 을 이용해야합니다.
문제2. 부서번호, 부서번호별 인원수를 출력하시오 !
db.emp.aggregate( { $group : { _id: "$deptno", 인원수: {$sum:1} } } )
문제3. 위의 결과를 다시 출력하는데 부서번호별 인원수가 높은것 부터 출력하시오 !
db.emp.aggregate( { $group : { _id: "$deptno", 인원수: {$sum:1} } }, { $sort : {"인원수" : -1 } } )
※ 설명 : -1 은 높은것 부터, 1은 낮은것 부터 출력됩니다.
문제4. 5백만건이 넘는 미국 항공 데이터에서 1996년도의 미국 항공기의 이륙과 착륙건수에 대한 아래의 SQL을 몽고디비로 구현하시오 !
select month, count(*) from airline group by month; 답: db.airline.aggregate( { $group : { _id:"$Month", 건수: {$sum:1} } } )
※ 설명: 컬럼명의 대소문자를 구분해야 됩니다.
문제5.월별로 비행기 출발 지연이 높은 달이 언제인지 알기 위해서 아래의 SQL을 몽고디비로 구현하시오 !
select Month, count(*) from airline where DepDelay > 0 group by Month; 답: db.airline.aggregate( { $match : { DepDelay : { $gt : 0 } } }, { $group : { _id:"$Month", 건수: {$sum:1} } } )
문제6.위의 결과에서 비행기 출발 지연에 대한 건수가 높은것 부터 출력하시오 !
select Month, count(*) from airline where DepDelay > 0 group by Month order by 2 desc; 답: db.airline.aggregate( { $match : { DepDelay : { $gt : 0 } } }, { $group : { _id:"$Month", 건수: {$sum:1} } }, { $sort : {"건수" : -1 } } )
■ 몽고디비로 출력된 결과를 csv 파일로 내리기
문제1. (팀장님의 요청) 문제27번의 결과를 csv 파일로 내리기 위해서 테이블로 생성합니다.
db.airline.aggregate( { $match : { DepDelay : { $gt : 0 } } }, { $group : { _id:"$Month", 건수: {$sum:1} } }, { $sort : {"건수" : -1 } } , { $out : "airline_1996" } ) db.airline_1996.find()
■ 몽고디비에서 data update 하기
다른 NoSQL 과는 다르게 몽고디비는 데이터를 수정할 수 있습니다.
NoSQL 이란 ?
Not only SQL 의 약자로 SQL 만 가지고 데이터를 검색할 수 있는것은 아니다의 뜻입니다.
문제1. 아래의 SQL 을 몽고디비로 구현하시오 !
update emp set sal = 9000 where ename='SCOTT'; db.emp.update( { ename : 'SCOTT' }, { $set : { sal : 9000 } }, { multi : true } ) db.emp.find()
설명: 몽고디비에서는 commit 이나 rollback 이 몽고디비 4.2 이상부터 지원됩니다.
문제2. 아래의 SQL을 몽고디비로 구현하시오 !
update emp set comm = 8000 where job='ANALYST'; db.emp.update( { job : 'ANALYST' }, { $set : { comm : 8000 } }, { multi : true } ) db.emp.find()
문제3. 아래의 SQL을 mongodb 로 구현하시오 !
delete from emp where ename='SCOTT'; db.emp.deleteOne( { ename : 'SCOTT' } ) db.emp.find()
문제4. 직업이 ANALYST 인 사원들을 지우시오 !
db.emp.deleteMany( { job : 'ANALYST' } ) db.emp.find()
한개를 지울때는 deleteOne 을 쓰고 여러개를 지울때는 deleteMany 를 씁니다.
문제5. 아래의 insert 문장을 몽고디비로 구현하시오 !
insert into emp(empno, ename, sal, deptno) values(1234,'aaa', 4000, 20); db.emp.insertOne( { empno : 1234, ename : 'aaa', sal : 4000, deptno : 20 } ) db.emp.find()
문제6. dept.csv 를 몽고디비에 테이블로 구성하시오 !
# cat /root/dept.csv | mongoimport --type csv -c dept --headerline --drop
문제7. 아래의 SQL을 몽고디비로 구현하시오 !
insert into dept(deptno, loc, dname ) values( 50, 'seoul', 'hr' ); db.dept.insertOne( { deptno : 50, loc : 'seoul', dname : 'hr' } ); db.dept.find()
■ 몽고디비와 파이썬 연동
#1. 로컬에 윈도우의 주피터 노트북을 켭니다.
#2. 명령 프롬프트 창을 열고 리눅스 서버로 ping 이 나가는지 확인합니다.
C:\Users\ITWILL>ping 192.168.56.1
Ping 192.168.56.1 32바이트 데이터 사용:
192.168.56.1의 응답: 바이트=32 시간<1ms TTL=128
192.168.56.1의 응답: 바이트=32 시간<1ms TTL=128
192.168.56.1의 응답: 바이트=32 시간<1ms TTL=128
192.168.56.1의 응답: 바이트=32 시간<1ms TTL=128
192.168.56.1에 대한 Ping 통계:
패킷: 보냄 = 4, 받음 = 4, 손실 = 0 (0% 손실),
왕복 시간(밀리초):
최소 = 0ms, 최대 = 0ms, 평균 = 0ms
#3. 명령 프롬프트 창에서 ssh 로 리눅스 서버에 root 로 접속되는지 확인합니다.
C:\Users\ITWILL>ssh root@192.168.56.1
root@192.168.56.1's password:
Last login: Wed Sep 25 10:43:28 2024 from gateway
[root@centos ~]#
[root@centos ~]#
#4. 주피터 노트북에서 pymongo 를 설치합니다.
pip install pymongo
#5. putty 에서 몽고디비의 기본 포트인 27017이 활성화 되었는지 확인합니다.
# ps -ef | grep 27017
#6. 아래의 코드를 이용해서 몽고디비와 연동합니다.
from pymongo import MongoClient
client = MongoClient('mongodb://192.168.56.1:27017/')
db = client['test']
collection = db['emp']
all_emp = collection.find()
import pandas as pd
df = pd.DataFrame( list(all_emp) )
df
--> 안되어서 넘어감
'빅데이터 분석(with 아이티윌) > 리눅스' 카테고리의 다른 글
[빅데이터분석] Linux_10. 리눅스 & 하둡 최신 버전 설치 (24.09.30) (0) | 2024.09.30 |
---|---|
[빅데이터분석] Linux_7.스파크 설치 및 운영 (3) | 2024.09.26 |
[빅데이터분석] Linux_5. 하둡 설치 (0) | 2024.09.23 |
[빅데이터분석] Linux_3. 리눅스함수 및 centos에 아나콘다 ,workbench 설치 (0) | 2024.09.23 |
[빅데이터분석] Linux_2. 리눅스 함수 및 maria db 설치 (0) | 2024.09.23 |