계단오르기는 다이나믹으로 해결할 수 있다. 연속해서 오른 계단이 하나인 것과 두개인 것을 계산하여 처리할 수 있다. 1번은 연속해서 오른 계단이 하나인것, 즉 두번 뛰어서 오른 계단에 대한 정보를 확인하는 것이다. i-2 번째 계단의 1번 연속, 2번 연속해서 오른 계단의 최대값가 현재 계단의 값의 합이다. 2번은 연속해서 오른계단이 두개인것, 즉 이전계단에서 한번오른 것이다. 이전계단에서 한번오른 값과 현재의 값을 더하여 결정한다. http://www.jungol.co.kr/bbs/board.php?bo_table=pbank&wr_id=792&sca=3050
숫자카드 문제는 다이나믹 프로그래밍을 이용하여 해결할 수 있다. 27123을 2글자씩 읽어서 숫자로 확인하고 34이상이면 분할한다. 27, 123 으로 분할하고 카드로 표현할 수 있는 형태가 몇개인지 확인한다. 카드로 표현 가능한 개수는 마지막 수를 표현하는 카드가 한자리 수인지, 두자리 수인지로 구분하여 점화식을 구성한다. D[i] = (D[i-1][0] * 2 )/2 + D[i-1][1] + (D[i-1][0] * 2 )/2 끝자리가 한자리수이면 마지막에 하나더 숫자가 붙어서 두자리 또는 한자리가 될수 있기 때문이다. 끝자리가 두자리수 이면 한자리수로 붙어서 표현이 가능하다. http://www.jungol.co.kr/bbs/board.php?bo_table=pbank&wr_id=683&sca=3050
UDTF는 한행을 입력받아서 여러 행을 반환하는 함수이다. take in a single input row and output a single output row 크게 4가지 종류가 있다. explode, inline, posexplodearray, map, struct 형식의 데이터를 테이블 json_tuplejson 문자열을 파싱하여 반환get_json_object() 와 비슷한데 속도가 빠르다. 대신 xpath를 이용한 처리는 안됨url_tupleurl 문자를 파싱HOST, PATH, QUERY, REF, PROTOCOL, AUTHORITY, FILE 를 반환stack전달한 데이터를 여러개의 행으로 반환 > select * from employee;OKid-1john["a","b","c","d"]{..
극장좌석문제는 다이나믹 프로그래밍으로 풀이가 가능하다. 전제조건은 좌우 한칸으로는 이동이 가능하다. 좌석이 2개일 경우 아래의 두개의 경우가 가능1, 22, 1좌석이 3개일때는 좌석이 2개인 경우에서 끝자리가 2인 경우는 3과 교환이 가능하기 때문에 2가지 경우가 나오고, 1인경우는 3과 교환이 불가능 하여 끝에 3이 붙는 하나의 경우만 나온다. 끝이 2 인 경우: (1*2)/2 + 1 = 2끝이 2 이 아닌 경우: (1*2)/2 = 1좌석이 3개인 경우 3가지 종류가 가능1, 2 -> 1, 2, 3 1, 3, 22, 1 -> 2, 1, 3좌석이 4개일때는 좌석이 3개인 경우에서 끝자리가 3인 경우는 4와 교환이 가능하기 때문에 4가지 경우가 나오고, 2인 경우는 4와 교환이 불가능하이 끝에 4가 붙는 ..
하이브 처리중 다음과 같은 오류가 발생할 때가 있다. Caused by: org.mariadb.jdbc.internal.util.dao.QueryException: Illegal mix of collations (latin1_bin,IMPLICIT) and (utf8mb4_general_ci,COERCIBLE) for operation '='at org.mariadb.jdbc.internal.protocol.AbstractQueryProtocol.getResult(AbstractQueryProtocol.java:479)at org.mariadb.jdbc.internal.protocol.AbstractQueryProtocol.executePreparedQuery(AbstractQueryProtocol.ja..
HDFS의 fsck 명령- HDFS 상의 다양한 불일치(블록 누락, 복제 되지 않은 블록)를 확인- 오류를 발견하고 수정하지는 않음(NameNode가 복구가능한 오류는 자동으로 수정)- 열린 파일은 무시함 > hadoop fsck /Status: HEALTHY Total size: 3984631262 B # 현재 사용중인 byte (hadoop fs -du -s / 명령어와 동일한 값) Total dirs: 678 Total files: 3453 Total symlinks: 0 Total blocks (validated): 3450 (avg. block size 1154965 B) # 최소 개수로 복제된 블록 Minimally replicated blocks: 3450 (100.0 %) # 기본 설정값 ..
특정 문자열과 일치하는 내용을 가지고 있는 파일을 확인하고 싶을 때 grep 을 이용하여 내용을 확인할 수 있다. -L, --files-without-match Suppress normal output; instead print the name of each input file from which no output would normally have been printed. The scanning will stop on the first match. -l, --files-with-matches Suppress normal output; instead print the name of each input file from which output would normally have been printed. T..
우지의 하이브 액션을 이용하는 방법은 다음과 같다. 다음의 파일을 준비필수: workflow.xml, count.hql, job.properties옵션: hive-site.xml생성한 파일을 hdfs에 업로드우지 명령어 실행oozie job --oozie http://localhost:11000/oozie -config ./job.properties -run localhost:8032 hdfs://localhost:8020 hive-site.xml oozie.use.system.libpath true oozie.launcher.mapreduce.job.acl-view-job * oozie.launcher.mapred.job.queue.name q1 mapred.job.queue.name queue ooz..
하이브에서 결과를 보여줄 때 결과 컬럼 정보를 출력하기 위해서는다음의 설정을 true 로 설정하면 된다. set hive.cli.print.header=true; 쿼리를 이용하여 테이블의 헤더를 출력하기 위해서는 hql 에 해당 옵션을 지정하고 실행하면 된다. 아래와 같이 cli_header.hql 파일을 생성하고, hive -f 를 이용하여 실행하면 query.result 에 칼럼의 헤더와 결과가 함께 입력되는 것을 볼 수 있다. SET hive.cli.print.header=true; SELECT * FROM sample LIMIT 100; > hive -f cli_header.hql >> query.result * INSERT OVERWRITE DIRECTORY 를 이용하여 파일시스템에 데이터를 쓸..
하이브에서는 쿼리를 이용하여 데이터를 로컬이나 HDFS에 파일을 생성하는 것이 가능하다. Standard syntax:INSERT OVERWRITE [LOCAL] DIRECTORY directory1 [ROW FORMAT row_format] [STORED AS file_format] (Note: Only available starting with Hive 0.11.0) SELECT ... FROM ... Hive extension (multiple inserts):FROM from_statementINSERT OVERWRITE [LOCAL] DIRECTORY directory1 select_statement1[INSERT OVERWRITE [LOCAL] DIRECTORY directory2 select..
우지를 이용하여 하이브 액션을 처리하는 중 하이브 클래스를 찾지 못하는 오류가 발생할 때가 있다. Failing Oozie Launcher, Main class [org.apache.oozie.action.hadoop.HiveMain], exception invoking main(), java.lang.ClassNotFoundException: Class org.apache.oozie.action.hadoop.HiveMain not foundjava.lang.RuntimeException: java.lang.ClassNotFoundException: Class org.apache.oozie.action.hadoop.HiveMain not foundat org.apache.hadoop.conf.Config..
- 랜덤 액세스 위주의 조인 - 한레코드씩 순차적으로 진행 - 테이블의 크기가 작을수록 좋음 - 온라인 프로그램에서 사용할 때 좋음 - Driving 테이블의 크기가 가장 많은 영향을 준다. - 조인하기전에 정렬 - 넓은 데이터 처리에 유리함 - 정렬에 필요한 데이터가 많아지면 메모리대신 디스크를 사용하므로 성능이 떨어질 수 있음 - 조인 조건의 인덱스 유무에 영향을 받지 않지만 Sort 가 필요하다. - 한쪽 테이블의 크기가 작을수록 좋음 - NL의 랜덤액세스, SMJ의 정렬작업에 대한 부담으로 등장 - 인덱스를 사용하지 않음, 인덱스 대신 Hash 함수를 사용 - 동등조인(=) 에서만 사용 - 수행 빈도가 높은 OLTP성 작업에서는 불리함 - 수행 빈도가 낮고, 쿼리 수행시간이 오래 걸리는, 대용량 ..
UDAF는 AbstractGenericUDAFResolver를 상속하여 구현한다.Resolver 클래스전달파라미터를 체크실제 처리 프로세스 구현체(GenericUDAFEvaluator 구현)를 반환Evaluator 클래스 init(), merge(), terminatePartial() 등의 실제 처리 구현 getNewAggregationBuffer() - 집계에 사용할 AggregationBuffer 반환reset - aggregation 이 재사용될 때의 처리init - 입력 받는 아규먼트와 반환값의 타입을 지정iterate - 매퍼가 동작하는 동안 반복하는 작업terminatePartial - 부분적으로 집계작업을 종류할 때 작업merge - 집계작업의 결과를 머지할 때 terminate - 작업이 ..
하이브의 UDF는 두가지 방법으로 구현할 수 있다. UDF 클래스를 상속evaluate() 함수를 구현하여 처리GenericUDF 클래스를 상속initialize(), evaluate(), getDisplayString() 함수를 구현하여 처리 UDF 클래스를 상속하는 방법이 간단하고 처리하기 쉽다.GenericUDF를 사용하면 다음의 장점이 있다고 한다. A Generic User-defined function (GenericUDF) for the use with Hive. New GenericUDF classes need to inherit from this GenericUDF class. The GenericUDF are superior to normal UDFs in the following wa..
하이브의 UDF는 UDF, UDAF, UDTF 로 구분된다. UDF: 한개의 행에서 동작한다. 입력과 출력은 하나이다. ex) TRIM()UDAF: 집계 함수이다. 여러 행의 데이터를 집계하여 하나의 결과를 출력합니다. ex) COUNT(), SUM()UDTF: 하나의 행을 입력으로 받아서 여러행의 데이터를 반환한다. ex) EXPLODE() 하이브에서 제공하는 기본 UDF를 이용할 수 있고, 사용자가 UDF 를 만들어서 적용할 수 도 있다. 사용자가 UDF를 만들어서 적용하는 방법은 다음과 같다. package sdk.hadoop.hive; import org.apache.hadoop.hive.ql.exec.UDF;import org.apache.hadoop.io.Text; public final cl..
자바의 기본 객체 함수 중 하나인 equal() 함수는 객체의 값을 비교하는 연산자이다. == 연산자는 객체의 주소를 비교하고, equals()는 객체의 값을 비교하는 연산자이다. 보통 equals()는 문자열(String)의 값을 비교하는데 많이 사용한다. Object의 equals() 함수는 다음과 같다. 즉, 객체의 주소값을 비교하여 반환한다. public boolean equals(Object obj) { return (this == obj); } 하지만 String 객체의 equals() 함수는 다음과 같다. 문자열의 char 를 하나하나 비교하여 동일하면 true, 다르면 false 를 반환한다. public boolean equals(Object anObject) { if (this == a..
아마존 S3 서비스 이용중 한국 리전에서 중국 리전의 S3에 접속하려고 하니 아래와 같은 오류가 발생하였다. aws configure 를 이용하여 cn 프로파일을 등록하였고, 키와 리전을 확인했는데 오류가 없었다. > aws s3 ls s3://bucket-name/ --profile cnAn error occurred (InvalidAccessKeyId) when calling the ListObjects operation: The AWS Access Key Id you provided does not exist in our records. 이럴때는 아래와 같이 리전을 추가하여 조회하면 오류를 해결 할 수 있었다. 프로파일에 리전을 등록했음에도, 왜 이런 오류가 발생하는지 아직 원인은 확인하지 못했다...
3351 [uber-SubtaskRunner] ERROR org.apache.sqoop.manager.SqlManager - Error reading primary key metadata: java.sql.SQLException: Column 'ORDINAL_POSITION' not found.java.sql.SQLException: Column 'ORDINAL_POSITION' not found. at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1075) at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:989) at com.mysql.jdbc.SQLError.createSQLExcept..
Cannot convert value '0000-00-00 00:00:00' from column 12 to TIMESTAMP. MySQL과 JDBC 를 이용하여 DB의 데이터를 처리하다보면 위와 같은 오류를 보는 경우가 있다. 원인은 MySQL의 timesamp 값이 '0000-00-00 00:00:00'이 입력되고, 이를 Java 형식으로 변환하는 과정에서 Java의 Date 값은 '0000-00-00 00:00:00' 을 지원하지 않기 때문에 발생한다. MySQL은 날짜형식을 입력하는 중 변환과정에서 오류가 발생하면 '0000-00-00 00:00:00' 으로 입력하고,Warn 을 발생시킨다. 이 때문에 Java 변환 과정에서 오류가 발생한다. 이를 해결하는 방법은 JDBC 연결 옵션에 zeroDa..
스쿱은 대량의 데이터를 아파치 하둡과 RDBMS 사이에서 전송하기 위해 디자인 된 툴이다. - 2012년 3월 아파치 톱레벨 프로젝트로 지정- 현재 1.4.6이 최신 버전(2017.03.10)- 스쿱2의 최신버전은 1.99.7, 스쿱1과 호환된지 않음, 아직 정식 릴리즈 되지 않음 - import: DB -> HDFS 로 데이터를 가져온다. - export: HDFS -> DB 로 데이터를 가져온다. [query 옵션을 이용하는 경우]- DB의 데이터를 쿼리로 조회하여 target-dir 위치로 복사sqoop import \ --connect jdbc:mysql://loclhost:7777/db?zeroDateTimeBehavior=convertToNull \ --username scott \ --pas..
Error: java.io.IOException: java.sql.SQLSyntaxErrorException: invalid callable syntaxat org.apache.sqoop.mapreduce.AsyncSqlRecordWriter.close(AsyncSqlRecordWriter.java:184)at org.apache.hadoop.mapred.MapTask$NewDirectOutputCollector.close(MapTask.java:679)at org.apache.hadoop.mapred.MapTask.runNewMapper(MapTask.java:802)at org.apache.hadoop.mapred.MapTask.run(MapTask.java:342)at org.apache.hadoo..
하이브는 CSV 형식의 파일을 효과적으로 적재하기 위한 CSV 서데를 제공한다. * Hive 0.14 버전부터 기본 지원 ** CSV 서데를 이용하면 테이블 칼럼의 타입은 String 으로 고정 - sepratorChar: 칼럼간의 구분자 - quoteChar: 칼럼의 값을 지정한 문자로 묶어준다. - escapeChar: 칼럼에 데이터를 입력할 때 파싱하지 않고 무시 CREATE TABLE my_table( a string, b string)ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.OpenCSVSerde'WITH SERDEPROPERTIES ( "separatorChar" = ",", "quoteChar" = "'", "escapeChar" = "\\") S..
Mixed update/insert is not supported against the target database yet 스쿱을 이용하여 exprot 명령을 처리할 때 위와 같은 오류가 발생하는 경우가 있다. --update-mode 를 allowinsert 로 설정하였을 때 발생한다. --update-key 에 지정한 칼럼이 동일한 데이터가 없어서 insert 를 하려고 할때 데이터베이스가 update insert 문을 지원하지 않아서 발생하는 오류이다. 스쿱 지라에서도 확인할 수 있다. (확인) 현재 1.4.2 버전 기준으로 오라클에서만 지원한다고 한다. 다른 DB 에서는 처리가 안되는 것 같다. PostgreSQL에서는 프로시저를 이용하여 처리할 수도 있다고 한다. >sqoop export --c..
- Total
- Today
- Yesterday
- oozie
- Python
- nodejs
- 오류
- airflow
- HIVE
- Tez
- 하둡
- bash
- java
- SPARK
- yarn
- 파이썬
- emr
- Linux
- 알고리즘
- 백준
- Hadoop
- build
- hbase
- 정올
- 다이나믹
- SQL
- ubuntu
- 하이브
- S3
- error
- mysql
- AWS
- HDFS
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |