2021년 1월 17일 일요일

Hive [10] - 날짜관련 함수

 

1. 날짜포맷 변환


from_unixtime(bigint unixtime, string format)

return값 : string


unix타임스탬프 값을 정해진 날짜형식에 맞추어 출력한다.

- select from_unixtime(1323308938, 'yyyy-MM-dd') from dual;


20210101포맷을 2021-01-01포맷으로 날짜형식변환도 가능하다.

- select from_unixtime(unix_timestamp('20210101, 'yyyyMMdd'), 'yyyy-MM-dd') from dual;



2. 특정 값 가져오기


날짜 부분만 리턴

select to_date('2021-01-13 10:11:34') from dual;

-> 2021-01-13


연도 부분만 리턴

select year('2021-01-13 10:11:34') from dual;

-> 2021


월 부분만 리턴

select month('2021-01-13 10:11:34') from dual;

-> 1


일 부분만 리턴

select day('2021-01-13 10:11:34') from dual;

-> 13


시간 부분만 리턴

select hour('2021-01-13 10:11:34') from dual;

-> 10


분 부분만 리턴

select minute('2021-01-13 10:11:34') from dual;

-> 11


초 부분만 리턴

select second('2021-01-13 10:11:34') from dual;

-> 34


날짜의 현재 주 수 리턴

select weekofyear('2021-01-13 10:11:34') from dual;

-> 2



3. 날짜 계산 함수

* yyyy-MM-dd 형식으로 입력


날짜비교 함수 

datediff(string enddate, string startdate)

return : int

ex ] select datediff('2021-01-23','2021-01-15')

-> 7


날짜 증가 함수 

date_add(stringdate, int days)

return : string 

ex ] select date_add('2021-01-23',20)

->2021-02-12


날짜 감소 함수 

date_sub(stringdate, int days)

return : string 

ex ] select date_add('2021-01-23',10)

->2021-01-13












from_unixtime(unix_timestamp('20140228' ,'yyyyMMdd'), 'yyyy-MM-dd')

[ Algorithm ] 가운데 글자 가져오기


문제 ] 

단어 s의 가운데 글자를 반환하는 함수. 단어의 길이가 짝수라면 가운데 두글자를 반환하면 됩니다.

sreturn
abcdec
qwerwe



제출 ]

class Solution {

    public String solution(String s) {

        int len = s.length();

        int idx = len / 2;

        return (len%2==0) ? s.substring(idx-1, idx+1) : s.substring(idx, idx+1);

    }

}



풀이 ]

substring 함수를 이용하여 글자의 길이가 홀수면 한글자, 짝수면 두 글자를 반환.

substring대신에 String.split("") 함수를 이용해 String을 Array로 형변환 하여 진행 할 수 도 있다. 


2021년 1월 15일 금요일

[ Algorithm ] 3진법 뒤집기


문제 ]

자연수 n이 매개변수로 주어진다. n을 3진법 상에서 앞뒤로 뒤집은 후, 이를 다시 10진법으로 표현한다. 

n (10진법)n (3진법)앞뒤 반전(3진법)10진법으로 표현
45120000217

따라서 7을 return해야 한다.



제출 ]

class Solution {

    public int solution(int n) {

        StringBuffer sb = new StringBuffer();

        StringBuilder stringBuilder = new StringBuilder();

        

        // 10진법을 3진법

        while( n != 0) {

            sb.append(n % 3);

            n = n / 3;

        }

        

        // 3진법을 10진법으로

        int answer = Integer.parseInt(sb.toString(), 3);

        return answer;

    }

}




풀이 ]


1. 10진법을 3진법으로 변환

2. 3진법 뒤집기

3. 뒤집은 값을 10진법으로 다시표현


[ 1. 10진법을 3진법으로 변환하는 방법 ]

N = 45라고 하면


45 / 3 = 15  ,  45 % 3 = 0 

15 / 3 = 5  , 15 % 3 = 0

5 / 3 = 1 , 5 % 3 = 2

1 / 3 = 0 , 1 % 3 = 1  


십진법 45는 3진법으로 1200이 된다.

즉 N / 3 = 0 이 될때까지 나머지를 구하도록 while문으로 구현한다.



[ 2. 3진법 뒤집기 ]

StringBuffer 클래스는 사용하여 자동적으로 값이 뒤집어지게 한다.

해당 클레스와 관련된 내용을 적자면,


String과 StringBuffer or StringBuilder의 차이 

String은 불변의 속성때문에 새로운 값을 할당할 때마다 새로운 주소를 할당한다. 그에 따른 메모리와 많은 임시가비지가 생성되므로 수정이 많은 작업이면 StringBuffer or StringBuilder와 같은 클래스들을 쓰는게 좋다. 

StringBuffer or StringBuilder는 주소 값을 변경하지 않고 새로운 값을 추가한다. 이 둘의 차이점은 동기화 지원유무이다. 

  • StringBuilder는 여러 쓰레드가 동시에 접근이 가능하능 
  • StringBuffer는 멀티쓰레드 환경에서 데이터변경을 허용하지 않아 비동기 작업에 적합
  • 단일 쓰레드는 StringBuilder보다 StringBuffer가 더 뛰어남


[ StringBuffer와 StringBuilder 테스트 ]

class Solution {
    public int solution(int n) {
        StringBuffer stringBuffer = new StringBuffer();
        StringBuilder stringBuilder = new StringBuilder();

        new Thread(() -> {
            for(int i=0; i<100000; i++) {
                stringBuffer.append(i);
                stringBuilder.append(i);
            }
        }).start();

        new Thread(() -> {
            for(int i=0; i<100000; i++) {
                stringBuffer.append(i);
                stringBuilder.append(i);
            }
        }).start();

        new Thread(() -> {
            try {
                Thread.sleep(5000);

                System.out.println("StringBuffer.length: "+ stringBuffer.length());
                System.out.println("StringBuilder.length: "+ stringBuilder.length());
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }).start();

    }
}


출력 StringBuffer.length: 977780
StringBuilder.length: 959296


결과 값을 보면, 쓰레드 동기화여부에 따라 데이터크기에 차이가 난다는 것을 볼 수 있다. 



[ 3. 뒤집은 값을 10진법으로 다시표현 ]

Integer객체의 parseInt 함수는 

parseInt(String s, int radix) - return int

두번째 인자를 통해 N진법 String을 10진번 Int형으로 값을 반환 받는다.



2021년 1월 13일 수요일

Hive [9] - Sqoop으로 Hive Table Input시, 구분자 설정

 

Sqoop으로 RDB 데이터를 입력받을 시 Column의 Text데이터가 "안녕하세요, 저는 어쩌고, ..." 와 같은 ','가 포함되었다면 구분자를 변경해야 한다. ( Default ',' )

아래 설정은 \t (탭)으로 구분자를 설정하며 Oozie XML -> Sqoop -> Hive Table에 넣는 과정을 담는다.


[ Oozie XML ]

아래 설정을 추가 한다.

<arg>--fields-terminated-by</arg>

<arg>"\t"</arg>



[ Hive Table Create ]

생성시 Delimited fields를 정의한다. ( 또는 업데이트 )

CREATE TABLE temp.table_temp

(

    id BIGINT,

    name VARCHAR(30),

    pay DECIMAL(10,2)

    tag VARCHAR(200)

)

ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'

STORED AS TEXTFILE;



Hive Table 결과 조회







2021년 1월 11일 월요일

[ SQL ] - 조회된 결과값 파티션으로 순번 매기기 ( ROW_NUMBER() )


ID | NAME 스키마의 테이블을

- SELECT * FROM db.test;

|   ID | NAME |
|------|------|
| 1525 |    a |
| 1528 |    b |
| 1525 |    w |
| 1526 |    b |
| 1526 |    v |
| 1528 |    c | 
| 1525 |    b |


Order by 된 결과에 순번을 매기는 방법은 ROW_NUMBER() 함수를 이용한다. 


- SELECT *, ROW_NUMBER()OVER(PARTITION BY id ORDER BY name ) AS nums

|   ID | NAME | RN |
|------|------|----|
| 1525 |    a |  1 |
| 1525 |    b |  2 |
| 1525 |    w |  3 |
| 1526 |    b |  1 |
| 1526 |    v |  2 |
| 1528 |    b |  1 |
| 1528 |    c |  2 |



2021년 1월 8일 금요일

Hive [8] - Encoding 과 Decoding

 

예제 20528978에 대하여 인코딩 디코딩.


[ 인코딩 ]

select base64(encode('20528978', 'UTF-8'))

결과 값 : MjA1Mjg5Nzg=


[ 디코딩 ]

select decode(unbase64('MjA1Mjg5Nzg='), 'UTF-8')

결과 값 : 20528978


[ 다양한 형식 ]

select decode(unbase64('MjA1Mjg5Nzg='), 'ISO-8859-1');

select decode(unbase64('MjA1Mjg5Nzg='), 'UTF-16LE');



변환해주는 웹사이트 

https://www.base64encode.org/

2021년 1월 3일 일요일

[ AWS ] Elasticache 원격접속


[ EC2에서 접속 ]


1. 접속할 EC2보안그룹 추가

사용자지정TCP / 포트범위: 6379 / 소스: 보안그룹ID 


- 설치

$ yum install gcc make gcc-c++

# $ wget http://download.redis.io/redis-stable.tar.gz

$ wget http://download.redis.io/releases/redis-5.0.8.tar.gz 

$ tar xvzf redis-stable.tar.gz

$ cd redis-stable

$ make distclean      

$ make


- 접속

$ src/redis-cli -c -h redis-endpoint.example.cluster.apne1.cache.amazonaws.com -p 6379


- 테스트

redis]set a "hellow"

redis]get a 


- 접속하지 않고 명령어 실행 ( 키삭제 )

./redis-cli -c -h 123.12.26.166 -p 6379 -a redistest KEYS "myobj/*" | xargs ./redis-cli -c -h 123.12.26.166 -p 6379 -a redistest  DEL




[ Direct 접속 ]


EC2를 거치지 않고 전용회선을 접속하고자 하는 곳에 열어주어 Direct로 접속할 수 있다.

추가금액과 시간이 소모된다.


1. AWS에 Direct전용회선 사용신청

2. 사용신청 확인메일을 amazon에게 받음

3. 사용신청확인메일을 amazon에게 응답( Location of Data Center / Network provider or vendor 정보)

4. LOA-CFA(확인코드)을 DX로케이션(전용회선설치회사)에 전달하여 회선설치요청

5. DX로케이션으로부터 회선설치 완료통지



참고 :

https://www.slideshare.net/awskorea/aws-direct-connect-58456263

https://docs.aws.amazon.com/ko_kr/directconnect/latest/UserGuide/create-connection.html