2021년 3월 29일 월요일

[ Practice Scala ] List 조건2 (Filter Positions in a List)


문제 ] 

Input Format

 integers contained in the list, each on a separate line.

Output Format

Output the list with the integers at odd positions removed i.e. the first element, the third element and so on. The relative positions of the remaining even-position elements should be the same as they were in the original array. Each integer will be on a separate line.

NOTE: By odd positions, we mean the first, third, fifth, etc position of the array needs to be filtered out. As per programming language conventions, these might (and they often do) correspond to indices  and so on.

Sample Input

2
5
3
4
6
7
9
8

Sample Output

5
4
7
8


제출 ]

def f(arr:List[Int]):List[Int] = {

    arr.tail.iterator.sliding(1, 2).toList.flatten

    //arr.view.zipWithIndex.filter(_._2 % 2 != 0).map(_._1).force.toList

}



풀이 ]

arr.tail.iterator.sliding(1, 2).toList.flatten

iterator의 함수 sliding을 이용해 리스트의 짝수 인덱스 값을 구분한다.


def 
sliding[B >: A](size: Intstep: Int = 1)GroupedIterator[B]

예시)
// Returns List(ArraySeq(1, 2, 3), ArraySeq(2, 3, 4), ArraySeq(3, 4, 5))
(1 to 5).iterator.sliding(3).toList

// Returns List(ArraySeq(1, 2, 3, 4), ArraySeq(4, 5))
(1 to 5).iterator.sliding(4, 3).toList

// Returns List(ArraySeq(1, 2, 3, 4))
(1 to 5).iterator.sliding(4, 3).withPartial(false).toList

첫번째 인자는 뽑을 갯수, 두번째 인자는 각 인덱스 마다 건널 뛸 값을 말한다.

리턴 값이 Iterator므로 toList로 형변환 후, flatten함수로 하나의 리스트를 만든다.

예시)
val xs = List(
           Set(1, 2, 3),
           Set(1, 2, 3)
         ).flatten
// xs == List(1, 2, 3, 1, 2, 3)

val ys = Set(
           List(1, 2, 3),
           List(3, 2, 1)
         ).flatten
// ys == Set(1, 2, 3)


다른 풀이법으로 는 

arr.view.zipWithIndex.filter(_._2 % 2 != 0).map(_._1).force.toList

가 있다.



2021년 3월 23일 화요일

[ Zeppelin ] Spark Interpreter Permission Error


에러메세지 ] 

org.apache.zeppelin.interpreter.InterpreterException: org.apache.zeppelin.interpreter.InterpreterException: Fail to open SparkInterpreter

...

Caused by: org.apache.zeppelin.interpreter.InterpreterException: Fail to open SparkInterpreter

...

Caused by: java.lang.reflect.InvocationTargetException

...

Caused by: org.apache.hadoop.security.AccessControlException: Permission denied: user=root, access=WRITE, inode="/user":hdfs:supergroup:drwxr-xr-x



원인 ]

Zeppelin실행 계정은 root로, 해당 디렉토리에 권한이 없어

/user/hdfs/에 스파크 staging을 생성하지 못해 생긴다.



해결 ]

/user 밑에 root 디렉토리 생성 후 

다시 제플린에서 스파크를 실행시키면 정상적으로 아래와 같은 파일이 생성된다  










(위-에러 / 아래-재실행 ) 






[ Practice Scala ] List 조건 (Filter Array)


문제 ]  

Input Format

The first line contains the delimiter .
The next  lines each contain an integer, which represents the elements of the list/array. You have to read the input to the End-Of-File.

Output Format

Print all the integers from the array that are less than the given upper limit  in value on separate lines. The sequence should be the same as it was in the original array.

Constraints


For any element,  in the array, 

Note

The purpose of this challenge is to learn how to write your own implementation of a filter function. We recommend not using the inbuilt library function.

Sample Input

3
10
9
8
2
7
5
1
3
0

Sample Output

2
1
0


제출 ]

def f(delim:Int,arr:List[Int]):List[Int] = {

    arr.filter(_<delim)

}



풀이 ]

받은 리스트 요소들 중에 인자값 delim보다 작은 것을 리턴하는 문제이다.


def 
filter(p: (A) => Boolean)List[A]

List.filter 함수를 통해 List.filter( x=> delim > x )와 같이 조건을 주어, 

각 요소들 중에 조건에 해당하는 값을 리턴한다. 


추가적으로 List.filter(_<delim).sorted, sorted함수를 추가해 정렬된 반환값을 

리턴할 수 있다.






2021년 3월 21일 일요일

[ Practice Scala ] 리스트 복제 (List Replication)


문제 ]

Given a list, repeat each element in the list  amount of times. The input and output portions will be handled automatically by the grader. You need to write a function with the recommended method signature.

Input Format

The first line contains the integer  where  is the number of times you need to repeat the elements.
The next  lines each contain an integer. These are the  elements in the array.

Output Format

Output each element of the original list  times, each on a separate line. You have to return the list/vector/array of  integers. The relative positions of the values should be the same as the original list provided in the input.

Constraints


Sample Input

3
1
2
3
4

Sample Output

1
1
1
2
2
2
3
3
3
4
4
4

제출 ]

def f(num:Int,arr:List[Int]):List[Int] ={

    return arr.flatMap(e=>List.fill(num)(e))

}



풀이 ] 

List클래스의 함수 flatMap을 이용한다. 비슷한 함수로 map이 있는데 둘간의 차이를 보면


예제)

val f = Seq("apple","banana","orange")

f.map(_.toUpperCase) //결과값 : List(APPLE, BANANA, ORANGE)

f.flatMap(_.toUpperCase) //결과값 List(A,P,P,L,E,B,A,N,A,N,A,.....G,E)


FlatMap 함수

final def flatMap[B](f: (A) => IterableOnce[B])List[B]


Fill 함수

def fill[A](n: Int)(elem: => A)List[A]

계산결과를 포함하는 목록을 n번 생성한다.


결과적으로 arr.flatMap(e=>List.fill(num)(e)) 내용은

arr배열을 flatmap으로 나누고 각 요소를 fill함수를 이용해 num만큼 반복시킨 목록들을 다시 List값으로 리턴시켜, 해당 문제에 원하는 결과값을 도출한다.





Map과 flatMap차이 : https://hamait.tistory.com/606








[ Hive ] Phoenix에 연동하는 External Hive Table 생성시 오류 (NoSuchColumnFamilyException)


[ 에러메세지 ]

  • Error while processing statement: FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask. MetaException(message:org.apache.hadoop.hbase.regionserver.NoSuchColumnFamilyException: Column family table does not exist in region hbase:meta,,1.1588230740 in table 'hbase:meta', {TABLE_ATTRIBUTES => {IS_META => 'true', REGION_REPLICATION => '1', coprocessor$1 => '|org.apache.hadoop.hbase.coprocessor.MultiRowMutationEndpoint|536870911|'}, {NAME => 'info', BLOOMFILTER => 'NONE', VERSIONS => '3', IN_MEMORY => 'true', KEEP_DELETED_CELLS => 'FALSE', DATA_BLOCK_ENCODING => 'NONE', TTL => 'FOREVER', COMPRESSION => 'NONE', CACHE_DATA_IN_L1 => 'true', MIN_VERSIONS => '0', BLOCKCACHE => 'true', BLOCKSIZE => '8192', REPLICATION_SCOPE => '0'} at org.apache.hadoop.hbase.regionserver.HRegion.checkFamily(HRegion.java:8420) at org.apache.hadoop.hbase.regionserver.HRegion.get(HRegion.java:7398) at org.apache.hadoop.hbase.regionserver.RSRpcServices.get(RSRpcServices.java:2269) at org.apache.hadoop.hbase.protobuf.generated.ClientProtos$ClientService$2.callBlockingMethod(ClientProtos.java:36800) at org.apache.hadoop.hbase.ipc.RpcServer.call(RpcServer.java:2399) at org.apache.hadoop.hbase.ipc.CallRunner.run(CallRunner.java:124) at org.apache.hadoop.hbase.ipc.RpcExecutor$Handler.run(RpcExecutor.java:311) at org.apache.hadoop.hbase.ipc.RpcExecutor$Handler.run(RpcExecutor.java:291) )



[ 원인 ]

CDH Hbase와 EMR Hbase 버전이 맞지 않아 생긴 오류

CDH Hbase-2.1, EMR-Hbase.1.4 



[ 해결 ]

1. Hbase버전 싱크를 맞춘다.

2. Hive to Phoenix를 다른 어플리케이션을 이용한다.



[ Hive ] Serde가 적용된 Hive테이블 컬럼 추가&변경


Hive Table Column Add는 Table에 서데가 적용되어 있으면 수행할 수 없다.

Column Replace 또한 마찬가지.


1. 새로운 스키마로 Hive Table을 만든다.


2-1. 기존에 있던 파티션을 새 Table의 파티션으로 수정한다.

Ex. Alter Table [테이블명] Partition (yymmdd='20210321') Set Location 'hdfs://127.0.0.1/user';


2-2. 새 테이블의 빈 파티션을 생성한 후, 기존 테이블의 서데파일(000000_0)을 새 테이블 파티션 위치로 옮긴다. 

Ex. sudo -u hdfs hdfs -dfs cp /user/hive/old../ /user/hive/new..../ 




그외 유용한 커멘드


* 테이블 정보 위치 확인

desc formatted [Table Name];


*테이블 파티션 리스트확인

show partitions [Table Name];


* 새 파티션 추가

Alter Table [Table Name] Add Partition (yymmdd='20210321');


* 파티션 LOCATION 수정

Alter Table [테이블명] Partition (yymmdd='20210321') Set Location 'hdfs://127.0.0.1/user';


* 파티션 삭제

Alter Table [Table Name] Drop Partition (yymmdd'20210321');