Big Data: 78개의 글
Shell Script에서 외부 하이브 테이블 가져오는 방법 외부에서 하이브 테이블 가져오기 (외부) 하이브 테이블 데이터 복사 (내부) 하이브 테이블 생성 (내부) 데이터 하이브 테이블로 로드(Load) 쉘(shell)에서 데이터를 덤프, 테이블 생성, 로드 까지 하는 방법 스크립트 스크립트에서 첫번째로 hadoop distcp를 이용해서 데이터를 덤프해 오자. cat을 이용해서 하이브 쿼리를 특정 디렉토리의 .hql을 생성 .hql의 파일을 hive -f를 통해서 실행 위 과정에서 Hive 쿼리를 직접 입력하지 않고, hql을 생성한 이유는 이후에 스크립트에서가 아닌 스크립트 내에 있는 여러 쿼리들 중에서 하나만 실행하고 싶을때 사용하면 좋다. 또한 cat을 이용하는 이유는 하이브 쿼리를 순수하게 그..
하이브에서 랜덤 샘플링 하는 방법 (셔플링) 하이브에서 수백만 수천만의 행이 있다고 생각을 해보자, 효율적으로 고정된 숫자를 임의로 샘플링을 하고 싶다면, 어떻게 효율적으로 할 수 있을까? 하지만, 동일한 방법으로 1000개를 가져오는 쿼리를 수행하면 같은 데이터가 샘플링이 된다. order by sql select * from my_table order by rand() limit 1000; 그렇다면, 임의로 정렬을 한뒤에 샘플링을 하면 어떨까? 아래와 같이 샘플링을 하면, 임의로 데이터를 정렬을 한 뒤에 1000개를 추출하기 때문에 매번 다른 결과를 준다. sort by sql select * from my_table sort by rand() limit 1000; 하지만 하이브에서는 데이터의 양이 ..
하이브(Hive) 테이블 join 성능 올리기, 최적화, 튜닝하는 방법 들어가며 하이브에서 테이블 조인의 성능을 올리기 위해서는 다양한 방법이 있지만, 크게 두가지 방법에 대해서 설명을 한다. 하이브에서 큰 두개의 테이블을 만약 그냥 조인을 한다면 쿼리를 날리고 다음 날 아침에 와도, 쿼리는 동작하고 있을 것이다. 두개의 테이블을 조인을 해보자 두개의 테이블을 조인을 하기 전에, 각 테이블의 성격을 알아야 한다. 한개의 테이블의 metadata의 성격이 있는 테이블, 즉 작은 테이블의 사이즈라면, 해당 테이블을 메모리에 올린 이후에, 조인을 하면 성능이 올라갈 것이고, 두 테이블이 너무 커서 메모리에 올리기 어렵다면, 조인할 키를 뭉탱이로 뭉쳐서 뭉탱이 끼리 조인을 하면 빠르게 할 수 있다. Map-Si..
하이브(Hive) 테이블 클러스터간 복사하기 두개의 클러스터(Cluster) A, B가 있다고 가정하고, A에서 B로 하이브 테이블을 복사하는 방법에 대해서 설명한다. 순서 [A]에서 [A]의 HDFS로 테이블 export [A]에서 [B]의 HDFS로 데이터 copy [B]의 HDFS에서 Hive로 데이터 import 코드 --export export table DB.table_name to 'hdfs://A:8020/data/import/table_name' --distcp hadoop distcp hdfs://A:8020/data/import/table_name hdfs://B:8020/data/import/table_name --import import external table DB.table_..
하이브(Hive) 테이블 생성 하이브 테이블이 만약 textfile로 되어 있다면, 테이블을 load하거나, hue에서 테이블을 로딩할때 에러가 발생하는 경우가 있다. malformed ORC 에러가 뜬다면, 하이브 테이블의 타입을 확인할 필요가 있다. 이럴 경우에는 아래와 같이 기존 textfile을 orc테이블의 형태로 생성한 뒤에 export/import를 하면 에러 없이 진행이 된다. 코드 drop table if exists target_table; CREATE TABLE target_table stored as orc tblproperties ("orc.compress"="ZLIB") as select * from source_table; 출처 : ourcstory.tistory.com/370..
PySpark 에서 NoneType을 Filtering 하는 방법 (any, all, subset) pyspark에서 drop method는 NULL을 가진 행을 제거하는데 가장 간단한 함수다. 기본적으로 NULL 값을 가진 행을 모두 제거를 한다. 모든 컬럼이 NULL인 경우 제거를 하고, 하나의 컬럼이 NULL인 경우 제거를 하고 싶은 경우가 있을것이다. 이런 경우에 어떻게 다르게 진행하는지 "any", "all"을 통해 설명 위 작업을 SQL에서 진행한다면 WHERE 절에 해당 컬림이 NULL인지 체크하는 구문을 넣어야 한다. 만약 모든 컬럼에 대해서 해야 하면? 모든 컬럼을 명시해야하는 단점이 있다. (SELECT * FROM TABLE WHERE COL1 IS NOT NULL) drop 메소드에..
Pyspark NoneType, Null, Blank, Empty String 필터링 하는 방법 pyspark에서 NoneType, NULL, Blank, Empty String 등 사용지 않는 값을 필털이 하는 방법에 대해서 설명을 한다. SQL로 진행하면 컬럼 하나 하나에 대해서 WHERE 절을 이용해서 필터링을 해야한다. 하지만 spark에서 Condition을 생성하고, 해당 Condition을 filter() 함수의 인자로 넘겨주면, 동일한 조건으로 모든 컬럼에 적용이 가능하다. 코드에서 살펴볼 내용 None, Null Empty String이 포함된 Row만 추출이 가능 None, Null, Empty String을 제외한 모든 Row만 추출도 가능 코드 설명 간단하게 각각 컬럼에 공통적으로 ..
Spark에서 제공하는 라이브러리 외에도 형태소 분석기나, 기존에 우리가 사용하던 라이브러리를 사용하는 방법에 대해서 설명한다. 클러스터의 모든 슬레이브에 /var/lib/의 이하 폴더에 사용할 라이브러리를 추가해 놓은 상태입니다. spark-shell이나 spark-submit을 할때 아래와 같이 --driver-class-path를 통해 라이브러리를 포함시키면 됩니다. 하지만 하나씩 하는건 무리가 있으니 아래와 같이 실행하면 모든 library를 한번에 import 할 수 있습니다. $ spark-shell --driver-class-path $(echo /var/lib/spark/*.jar | tr ' ' ',') 하지만? 위처럼 하면 아래와 같은 Exception이 발생을 합니다. class의 p..
들어가며 데이터 분석에서 가장 많이, 그리고 자주 사용하는 field가 timestamp의 값이 아닐까 싶다. 그 중에서도 timestamp의 raw데이터를 통해서 새로운 feature를 생성하는 방법이 있다. 예를 들어 날짜별 사용자 방문 수 라고 할때, timestamp의 값에서 우리는 month와 day를 추출해서 새로운 feature의 값으로 사용을 해야 한다. 소스코드 DataFrame의 데이터 타입인 df에서 select의 함수를 통해서 원하는 Column을 추출을 하는 과정이다. timestamp_milli의 값은 ms의 단위의 값이기 때문에 1000을 나눈뒤에 spark에서 제공하는 functions의 라이브러리를 import한 뒤에 사용하면 된다. from_unixtime을 통해 date..
들어가며 스파크에서 구현을 하다 보면 각 객체간의 변환(?)이 자유로워야 하는것 같다. 예를 들면 RDD에서 추출한 데이터를 DataFrame으로 생성한다든지, DataFrame에서 여러개의 Row를 추출해서 새로운 RDD를 생성한다는 식의 경우를 말한다. 이번에 당면한 문제는 Json Object의 요소를 저장하고 있는 Seq의 Collection을 갖고 있었고, 이 Collection을 바탕으로 DataFrame의 생성이 필요했다. 이번에는 Seq[org.apache.spark.sql.Row]의 데이터를 RDD와 DataFrame으로 변환하는 방법에 대해서 정리를 해보려고 한다. 소스코드 logData는 org.apache.spark.sql.Row의 값을 갖고 있다. logData에서 field명이 ..