Hive에서 Java 함수 호출 시 byte array 인수 전달

Hive에서 reflect 함수를 사용해서 Java 함수 호출이 가능한데
호출되는 Java 함수가 byte array를 인수로 받는 경우 Hive 쿼리에서 다음과 같이 전달하려는 string(이 예시에서는 “abc”)을 binary로 바꾸어서 전달

SELECT reflect("java.util.UUID", "nameUUIDFromBytes", BINARY("abc") )

즉, binary 타입이 Java의 byte array에 대응됨

<참고>

  • 예시 쿼리에서 사용된 Java 함수: https://docs.oracle.com/javase/8/docs/api/java/util/UUID.html#nameUUIDFromBytes-byte:A-
  • 테스트 Hive 버전: 1.2
  • reflect 기능은 Hive 사용자의 권한에 따라 허용되지 않을 수도 있음

Akerberg’s Refinement of AM-GM

(From the book The Cauchy-Schwarz Master Class by J. Michael Steele, Exercise 2.10)

For nonnegative \(a_1, a_2, \ldots, a_n\) and \(n \ge 2\)

$$ a_n \bigg(\frac{a_1+ a_2+ \ldots + a_{n-1}}{n-1} \bigg)^{n-1} \le \bigg(\frac{a_1+ a_2+ \ldots + a_n}{n} \bigg)^n $$

Proof.

Let \(y_i = \frac{a_1+ a_2+ \ldots + a_i}{i}\) for \(i \ge 2 \).

Then the inequality can be written as \(\frac{a_n}{y_{n-1}} \le \bigg(\frac{y_n}{y_{n-1}} \bigg)^n \).

On the other hand, \( n \cdot y_n – (n-1) \cdot y_{n-1} = a_n \), hence \( n \cdot \frac{y_n}{y_{n-1}} – (n-1) = \frac{a_n}{y_{n-1}} \).

Therefore, \( n \cdot \frac{y_n}{y_{n-1}} – (n-1) \le \bigg(\frac{y_n}{y_{n-1}} \bigg)^n \).

If we let \(y = \frac{y_n}{y_{n-1}} \), this inequality can be written as \( n \cdot y – (n-1) \le y^n \).

So it suffices to show that \( n (y-1) \le y^n – 1 = (y-1)(y^{n-1}+ \ldots +1) \).

It is easy to prove this inequality by considering two cases \(y \ge 1 \) or \(y \lt 1 \).

공백 없는 SQL 만들기

가끔은 SQL 문장에 공백이 없어야 하는 경우가 있다.

예를 들면 SQL 문장을 인수(argument)들 중의 하나로 어딘가 전달해야 하는데 공백이 인수들의 구분자로 인식되는 상황.

이럴 때 공백을 제거하면서 내용을 유지하고 싶다면 다음과 같이 공백이 나타나는 위치마다 대신 /**/을 넣어주면 된다.

예)

SELECT col FROM table WHERE col = 1
  ↓ ↓ ↓ ↓ ↓
SELECT/**/col/**/FROM/**/table/**/WHERE/**/col/**/=/**/1

 

[푸켓]섬 투어

  • 오후에 출발해서 몇몇 섬을 둘러보고 저녁 뷔페를 배에서 먹는 섬 투어
  • 푸켓의 동쪽 어디쯤 있는 항구에서 배가 출발
  • 숙소로 픽업을 오는데 도로 사정이 썩 좋지는 않아 항구까지 이동할 때 거리에 비해 시간이 오래 걸림
  • 섬 풍경은 괜찮은 편
  • 이 지역이 007 영화 ‘황금총을 가진 사나이’에 배경으로 나온 곳 (아래 유튜브 동영상 참고)
  • 섬에는 카누를 타고 들어가는데 현지인들이 카누에서 노를 저어주고 사진도 열심히 찍어줌

 

평균들의 비율과 비율들의 평균에 대하여

배경

예를 들어 두 종류의 양의 수열의 평균적인 비율을 알고 싶을 때, 종종 전체적인 평균의 비율 대신 비율들의 평균을 사용하려는 유혹이 생기기 쉽다. 각 쌍들의 비율도 관심의 대상이니 기왕 이것들을 구했다면 계산된 비율들의 평균을 사용하는 것이 더 간단하기 때문이다. 하지만 후자의 경우 각각의 비율 계산 시 데이터의 규모가 고려되지 못하는 문제가 있다.

위에서 기술한 내용을 식으로 표현하면, 두 개의 수열 \(l_1, l_2, \ldots , l_n\) 와 \(m_1, m_2, \ldots , m_n\) 가 주어졌을 때 둘 사이의 평균적인 비율은, 예외가 있을 수 있지만, 대부분의 경우 $$ (m_1+ m_2+ \ldots + m_n)/n \over (l_1+ l_2+ \ldots + l_n)/n $$와 같은 형태가 바람직하다. $$ \big({m_1 \over l_1} + {m_2 \over l_2} + \ldots + {m_n \over l_n}\big) \over n $$에서는 \(m_k\)와 \(l_k\)가 상대적으로 작으면서 \(m_k \over l_k\)이 평균에 큰 영향을 주는 상황이 있을 수 있고 이 결과는 두 수열의 전체적인 평균이라는 목적에 적당치 않다.

숫자를 대입해 본다면 \(m_1 = 999, m_2 = 5 \)이고 \(l_1 = 1000, l_2 = 1 \)인 경우 전체 평균들의 비율인 \( (999 + 5)/2 \over (1000 + 1)/2 \)는 약 \(1.003 \)정도이다. 그에 반해 비율들의 평균은 \( ({999 \over 1000} + {5 \over 1})/2 \)인 약  \(3 \) 정도가 된다. 두 번째 수들(5와 1)의 비율이 1000 정도인 첫 번째 수들의 비율에 비해 적지 않은 영향을 주기 때문이다.

질문

일반적으로 평균들의 비율과 비율들의 평균이 같지 않다는 것은 위의 예시로 알 수 있다. 그러면 둘 사이의 부등식을 도출할 수 있는 조건은 어떤 것인가? 즉, 어떤 조건을 만족할 때 둘 사이의 부등식을 결정할 수 있는가?

체비쇼프 합 부등식 (Chebyshev’s sum inequality)

위의 질문에 답하기 위해 체비쇼프 합 부등식을 사용할 것이다. 부등식에 대한 정의는 다음 페이지에서 찾을 수 있다; https://en.wikipedia.org/wiki/Chebyshev%27s_sum_inequality

결론만 요약하면, 두 수열이 둘 다 단조 증가하거나 둘 다 단조 감소하면,
$${1 \over n} \sum_{k=1}^n a_k b_k \ge \bigg({1 \over n} \sum_{k=1}^n a_k \bigg) \bigg({1 \over n} \sum_{k=1}^n b_k \bigg) $$
이고, 두 수열 중 하나가 단조 증가하고 다른 하나가 단조 감소하면,
$${1 \over n} \sum_{k=1}^n a_k b_k \le \bigg({1 \over n} \sum_{k=1}^n a_k \bigg) \bigg({1 \over n} \sum_{k=1}^n b_k \bigg) $$
이다.

이 사실을 사용하면,
\(m_1, m_2, \ldots , m_n\)과 \({m_1 \over l_1}, {m_2 \over l_2}, \ldots, {m_n \over l_n} \)이 둘 다 단조 증가하거나 단조 감소하면
$$\frac{m_1+m_2+\ldots+m_n}{n} \ge \bigg(\frac{{m_1 \over l_1} + {m_2 \over l_2} +\ldots + {m_n \over l_n}}{n} \bigg) \bigg(\frac{l_1+l_2+\ldots+l_n}{n} \bigg)$$ 이고, \(m_1, m_2, \ldots , m_n\)과 \({m_1 \over l_1}, {m_2 \over l_2}, \ldots, {m_n \over l_n} \)중 하나가 단조 증가하고 다른 하나가 단조 감소하면
$$\frac{m_1+m_2+\ldots+m_n}{n} \le \bigg(\frac{{m_1 \over l_1} + {m_2 \over l_2} +\ldots + {m_n \over l_n}}{n} \bigg) \bigg(\frac{l_1+l_2+\ldots+l_n}{n} \bigg)$$ 임을 알 수 있다.

따라서 모든 항들이 양수라고 가정하면 각각의 경우 부등식은
$$\frac{\cfrac{m_1+m_2+\ldots+m_n}{n}}{\cfrac{l_1+l_2+\ldots+l_n}{n}} \ge \frac{{m_1 \over l_1} + {m_2 \over l_2} +\ldots + {m_n \over l_n}}{n} $$ 와
$$\frac{\cfrac{m_1+m_2+\ldots+m_n}{n}}{\cfrac{l_1+l_2+\ldots+l_n}{n}} \le \frac{{m_1 \over l_1} + {m_2 \over l_2} +\ldots + {m_n \over l_n}}{n} $$ 로 쓸 수 있어 평균들의 비율과 비율들의 평균 사이의 부등식을 얻게된다.

하지만 수열들이 보통 위와 같은 형태의 단조 증가나 단조 감소 조건을 만족하지는 않으므로 이 부등식을 적용할 수 있는 경우는 많지 않다.

안드로이드 킨들 앱에서 로컬 파일 읽기

이슈

파일 첨부하여 킨들(아마존)로 이메일을 보내려면 아래와 같은 제약이 있다.

  • 25MB가 넘는 파일은 처리가 안 됨
  • mobi 파일은 되는데 azw 파일은 안 됨

대안

아마존으로 파일을 보내지 않고 안드로이드 기기에 바로 파일을 저장해서 킨들로 읽는 방법이 있다. (시험 환경: 안드로이드 버전 9)

  1. 파일 관리자를 실행
  2. 내부저장소(internal storage) 보기 옵션 활성화
  3. 내부 저장소의 최상위 위치(예를 들면 Download나 DCIM 같은 폴더가 보이는 위치)에서 kindle 이라는 이름의 폴더를 (이미 있지 않다면) 만듬
  4. kindle 폴더에 읽으려는 파일 복사
  5. 킨들 앱을 실행하고 복사한 파일이 인식되는지 확인

[마우이]배 타고 석양 보기

  • 해 지기 좀 전에 배 타고 출발하여 저녁 먹으면서 석양 보는 상품
  • 간단한 공연도 함
  • 뷔페식이라고 해서 먹을게 많을 줄 알았는데 내가 탄 배는 생각보다 음식이 부실
  • 칵테일, 와인, 맥주 등 주류는 무제한
  • 인터넷 검색하면 예약할 수 있는 상품이 많이 있고 시간이 맞으면 현지에서 표를 구할 수도 있음

이 배를 타고 감

풍력 발전기

[하와이]Mokulele 항공 탑승기

배경

오아후에서 마우이로 가는 비행기표를 알아보다가 하와이안 항공보다 약간 싼 항공사가 있길래 선택한 곳이 모쿨렐레(Mokulele) 항공.

우선 하와이 가기 전에 불상사가 하나 있었는데, 처음 예약했던 호놀룰루에서 마우이의 카훌루이(Kahului) 공항으로 가는 비행기를 항공사측에서 일방적으로 취소해 버림.

스케줄을 변경하는 과정에서 카훌루이 공항이 아니라 머물 예정이었던 리조트에서 가까운 카팔루아(Kapalua) 공항으로 행선지를 변경했는데 이건 결과적으로 잘한 일이었음.

어쨌든 호놀룰루 공항에서 마우이로 가려고 모쿨렐레 항공 데스크를 찾아가려고 하니 그것부터 찾기가 어려웠음(안내하는 사람이나 지나가는 사람들에게 물어봐도 제대로 아는 사람이 거의 없었음)

결국 수소문해서 알아냈는데 무료 셔틀을 타고 이동해야 하는 3 터미널 지역에 모쿨렐레 항공 데스크가 있었음

비행기

내가 본 이 항공사 비행기는 전부 Cessna Caravan 기종이었는데 (아래 비디오 참고)

대략 8명 정도가 타는 크기라서 마치 비행기 투어하는 느낌이었음

모쿨렐레 비행기 장점

  • 큰 비행기보다 훨씬 좋은 전망을 볼 수 있음
  • 승객이 워낙 적다보니 체크인을 위해 기다리는 시간이 거의 없고 심지어 정시보다 먼저 출발.
  • 비행기만 내리면 버스처럼 바로 짐 찾아서 나갈 수 있음.

모쿨렐레 비행기 단점

  • 항공사가 영세해서 그런지 처음에 적었듯이 일방적으로 스케줄이 변경되는 위험이 있음. 나중에 인터넷 검색해 보니 이런 경우가 종종 있는 듯.
  • 비행기 타는 곳이 대부분의 항공사가 모여있는 1, 2 터미널이 아니고 따로 떨어져서 찾기 어려움
  • 소음이 크고 그리 안락하지는 않음 (아래 착륙 동영상 참고)