필드에 의한 데이터를 미리 정의 된 파티션 수로 파티션하는 가장 좋은 방법은 무엇입니까?열을 기준으로 파티션을 나누지 만 고정 된 파티션 수를 유지하는 효율적인 방법은 무엇입니까?
현재 partionCount = 600을 지정하여 데이터를 파티션하고 있습니다. 600이라는 숫자는 내 데이터 집합/클러스터 설정에 대해 최상의 쿼리 성능을 제공합니다.
val rawJson = sqlContext.read.json(filename).coalesce(600)
rawJson.write.parquet(filenameParquet)
는 지금은 열 'EVENTNAME'에 의해이 데이터를 분할하지만, 현재 약 2,000 독특한 eventNames 플러스 각 EVENTNAME의 행 번호가 균일하지 여전히 개수 (600)의 데이터를 유지하려는. 약 10 개의 eventNames에는 데이터의 50 % 이상이 데이터 비뚤어 짐을 일으 킵니다. 그러므로 아래처럼 분할하면 그다지 성능이 떨어진다. 글을 쓰는 데는 5 배나 많은 시간이 걸립니다.
val rawJson = sqlContext.read.json(filename)
rawJson.write.partitionBy("eventName").parquet(filenameParquet)
이러한 시나리오의 데이터를 분할하는 좋은 방법은 무엇입니까? eventName으로 파티션을 나누어도 600 개의 파티션으로 나누는 방법이 있습니까?
내 스키마는 다음과 같습니다
{
"eventName": "name1",
"time": "2016-06-20T11:57:19.4941368-04:00",
"data": {
"type": "EventData",
"dataDetails": {
"name": "detailed1",
"id": "1234",
...
...
}
}
}
감사합니다!
감사합니다. – vijay
계산 항목 (eventName의 맵)으로 파티션을 다시 분할하는 경우 eventName으로 필터링하는 쿼리 (즉, WHERE eventName == "foo")는 관련 파티션 만 읽을 수 있고 전체 테이블 검색은 수행 할 수 없지만, 이제 더 이상 eventName이 분할되지 않았기 때문에? – vijay
가장 효율적인로드는 파티션 열을 정확하게 필터링 할 때만 발생합니다. 시간이 지남에 따라 왜곡이 안정적이면 정적 매핑을 사용하고 (쿼리 버킷 일 필요는 없으며 쿼리를 수행하는 동안 동일한 함수를 적용합니다) 스큐가 시간이 지남에 따라 안정적이지 않으면 시간 경과에 따라 이벤트 - 파티션 맵의 데이터 구조를 개별적으로 유지 보수해야하며, 쿼리하는 기간 동안 파티션을 병합하여 필터링하면 파티션 수를 효율적으로 줄일 수 있습니다 파티션) 및 이벤트 이름 (파티션 내에서 초점을 맞추기 위해). – Sim