CSV 파일 다루기

Header 즉 첫번째 줄 linux에서 삭제하기

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

# 덮어쓰기 전의 파일을 확장자.bak를 붙여서 보관하는 것이 가능하다
sed -i.bak -e '/^#/d' config.txt

# DATA.csv에서 첫번째 줄 제거하여 DATA_NO_HEADER.csv 생성
sed '1d' DATA.csv > DATA_NO_HEADER.csv

# 동일한 이름으로 첫번째 줄 제거
sed -i '1d' DATA.csv


# 패턴을 포함하는 선을 삭제
vi DATA.csv
:g/<pattern>/d
:wq

# '#'문자가 포함된 라인 삭제하면서 공백 제거된 내용만 출력
sed '/#/d' jupyterhub_config.py | sed '/^$/d'


#덮어쓰기
cat > 명령어는 덮어쓰기 명령어이다.
# 이어쓰기
. cat >> [파일 경로 / 이름]

  1. cat [ 파일 경로 / 이름 ]

    • 파일을 열어 내용을 출력
  2. cat > [ 파일 경로 / 이름 ]

    • 같은 이름의 파일이 없는 경우 : 파일 새로 만들고 내용 입력하기

    • 같은 이름의 파일이 있는 경우 : 파일 덮어쓰고 내용 새로 입력하기

  3. cat >> [ 파일 경로 / 이름 ]

    • 같은 이름의 파일이 없는 경우 : 파일 새고 만들고 내용 입력하기

    • 같은 이름의 파일이 있는 경우 : 기존 파일의 내용 밑에 이어쓰기

첫줄 일괄 삭제해서

find . -type f -name “*.csv” -exec sed -i “-new” ‘1d’ {} ;

CSV

Comma Separated Values

HBase와 Hive 차이는?

  • HBase는 NoSQL 데이터베이스이고 Hive는 하둡잡을 실행하는 DW 프레임워크이다.

  • HBase는 HDFS위에서 동작하고, Hive는 MapReduce 위에서 동작한다.

  • Schema flexibility: 다양한 구조와 포맷의 데이터를 처리하고 저장합니다.

  • SQL-like queries: Hadoop에서

  • Data management:

Hive DDL

하이브는 CSV 형식의 파일을 효과적으로 적재하기 위한 CSV 서데를 제공한다.

  • Hive 0.14 버전부터 기본 지원
    • CSV 서데를 이용하면  테이블 칼럼의 타입은 String 으로 고정
  • sepratorChar: 칼럼간의 구분자
  • quoteChar: 칼럼의 값을 지정한 문자로 묶어준다.
  • escapeChar: 칼럼에 데이터를 입력할 때 파싱하지 않고 무시
1
2
3
4
5
6
7
8
9
10
11
12
13
CREATE TABLE my_table
(   
   a string
,   b string
)
ROW FORMAT SERDE
'org.apache.hadoop.hive.serde2.OpenCSVSerde'
WITH SERDEPROPERTIES
(   "separatorChar" = ","
,   "quoteChar"     = "'"
,   "escapeChar"    = "\\"
)
STORED AS TEXTFILE;

[참고한 게시글]

https://118k.tistory.com/451

태블로 UDT 4기 day10

TIL, Today I Learn
총 복습

[DAY 10] 비즈니스 질문 해결하기

태블로 UDT 4기 day9

TIL, Today I Learn
테이블 계산식에 대해 배움

[DAY 9] 집합은 분석 앞으로 집합 - 과제

[1] 전체 매출 순위 vs 특정 지역 매출 순위

[2] 장바구니 & 교차판매 분석

태블로 UDT 4기 day8

TIL, Today I Learn
테이블 계산식에 대해 배움

[DAY 8] 공간의 지배자 - 과제

[1] 맵 이중축 + 맵 배경 커스텀 + AREA 함수 실습

[2] 맵 다중 레이어 실습나열하기

태블로 UDT 4기 day6~7

TIL, Today I Learn
테이블 계산식에 대해 배움

[DAY 6 - 7] 테이블 계산식 - 과제

[1] 테이블 계산식을 이용한 성장률 계산

[2] 제품 대분류별 매출 기준 상위 10개 제품 나열하기

[3] 파레토차트와 움직이는 참조선 그리기

태블로 UDT 4기 day3~5

TIL, Today I Learn
LoD에 대한 이해도가 높아짐

[DAY 3 - 5] 차원의 지배자1 LoD - 과제

[1] Fixed로 빈 행 채우기

[2] 시트 제목에 기간 명시하기

[3] 키워드 분석

3-1. 상위 10개 키워드

3-2. 순위 급상승 키워드

[4] 올해 vs 작년 기준 고객별 평균주문단가 구해서 증감율 구하기

태블로 UDT 4기 day1~2

TIL, Today I Learn
날짜함수 사용법에 대해 배움

[DAY 1 - 2] 시간의 지배자 - 과제

[1] 특정 날짜 기준으로 기준 월 vs 전 월 매출 비교

1-1. DATEPART 함수 사용하기

1-2. DATETRUNC, DATEADD 함수 사용하기

1-3. DATEDIFF 사용하기

[2] 특정 날짜 기준 MTD, 전년도 MTD

[3] 특정 날짜 기준 YTD, 전년도 YTD

[4] 전년 동기 대비 증감율 (YoY) 구하기

[번외] 달력에 수익률 표현하기

Tableau Embedding

Tableau Server에서 설정

Tableau Embedding API Version 2

Tableau Embedding API Version 3

tsm(Tableau Server Manager)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
cd /opt/tableau/tableau_server/
tsm configuration get -k gateway.public.host
#server.tableau.com
tsm configuration get -k gateway.trusted
#127.0.0.1, 127.0.0.2
tsm configuration get -k gateway.trusted_hosts
#server.tableau.com
tsm configuration get -k gateway.public.port
#443

tsm configuration get -k vizportal.rest_api.cors.enabled
#true
tsm configuration get -k vizportal.rest_api.cors.allow_origin
#https://127.0.0.1 https://server.tableau.com, https://127.0.0.2, https://web.tableau.com
tsm configuration get -k wgserver.unrestricted_ticket
#true
tsm configuration get -k wgserver.clickjack_defense.enabled
#false
tsm configuration get -k vizportal.oauth.external_authorization_server.max_expiration_period_in_minutes
#600

tsm pending-changes apply

Window

  1. hosts 파일 우클릭 > Code(으)로 열기 > 수정 > 저장 > “Failed to save ‘hosts’: Insufficient permissions.
  2. Select ‘Retry as Admin’ to retry as administrator.”라는 알림창이 뜨면 [Retry as Admin…] 클릭 > Windows 명령 처리기 [예] 클릭
C:\Windows\System32\drivers\etc\hosts
1
2
127.0.0.1 server.tableau.com
127.0.0.2 web.tableau.com

Mac

Mac(iterm, terminal)
1
2
3
4
5
6
sudo vim /private/etc/hosts #i

127.0.0.1 server.tableau.com
127.0.0.2 web.tableau.com

# :wq

*.tableau.com로 Domain 맞춰서 SameSite Error 해결

Python, Java, JavaScript로 구현

token이 제대로 됐는지 https://jwt.io/에서 확인

JSONWebToken.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import jwt
token = jwt.encode(
{
"iss": connectedAppClientId,
"exp": datetime.datetime.utcnow() + datetime.timedelta(minutes=5),
"jti": str(uuid.uuid4()),
"aud": "tableau",
"sub": user,
"scp": ["tableau:views:embed", "tableau:metrics:embed"]
},
connectedAppSecretKey,
algorithm = "HS256",
headers = {
'kid': connectedAppSecretId,
'iss': connectedAppClientId
}
)
JSONWebToken.java
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
import com.nimbusds.jose.*;
import com.nimbusds.jose.crypto.*;
import com.nimbusds.jwt.*;

import java.util.*;

...

String secret = "secretvalue";
String kid = "connectedAppSecretId";
String clientId = "connectedAppClientId";
List<String> scopes = new
ArrayList<>(Arrays.asList("tableau:views:embed"));
String username = "username";
JWSSigner signer = new MACSigner(secret);
JWSHeader header = new
JWSHeader.Builder(JWSAlgorithm.HS256).keyID(kid).customParam("iss", clientId).build();
JWTClaimsSet claimsSet = new JWTClaimsSet.Builder()
.issuer(clientId)
.expirationTime(new Date(new Date().getTime() + 60 * 1000)) //expires in 1 minute
.jwtID(UUID.randomUUID().toString())
.audience("tableau")
.subject(username)
.claim("scp", scopes)
.build();
SignedJWT signedJWT = new SignedJWT(header, claimsSet);
signedJWT.sign(signer);
model.addAttribute("token", signedJWT.serialize());
nest.js
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
import { Injectable } from '@nestjs/common';
import { JwtService } from '@nestjs/jwt';
import { v4 as uuid } from 'uuid';
import * as config from 'config';

const tableauConfig = config.get('tableau');

@Injectable()
export class TableauService {
constructor(private jwtService: JwtService) {}

async getTableauToken(username: string){
const token = await this.jwtService.sign(
{
iss: tableauConfig.connectedAppClientId,
aud: 'tableau',
jti: uuid(),
sub: username,
scp: [
'tableau:view:embed',
'tableau:views:embed_authoring',
],
},
{
header: {
alg: 'HS256',
kid: tableauConfig.connectedAppSecretId,
iss: tableauConfig.connectedAppClientId,
},
secret: tableauConfig.secretvalue,
expiresIn: '5m',
},
);
return token;
}
}