7
A
답변
12
이 동작을 모방하는 기본 제공 함수 나 UDF를 모르지만 HIVE 0.13
을 사용하는 경우 row_number()
함수를 사용하여 원하는 결과를 얻을 수 있습니다.
select pk, col_1, col_2, ... , col_n
from (
select pk, col_1, col_2, ... , col_n, row_number() OVER (ORDER by pk) as rank
from some_database.some_table
) x
where rank between 31 and 50
0
public class CountRatingQueryBuilder {
private static final String SCORING_TABLE_NAME = "web_resource_rating";
private final Connection connection;
private final ScoringMetadata scoringMetadata;
private final SelectSelectStep select;
private final Factory create;
public CountRatingQueryBuilder(Connection connection, ScoringMetadata scoringMetadata){
this.connection = connection;
this.scoringMetadata = scoringMetadata;
create = new Factory(this.connection, SQLDialect.MYSQL);
select = create.select();
withSelectFieldsClause();
}
public CountRatingQueryBuilder withLimit(int limit){
select.limit(limit);
return this;
}
public CountRatingQueryBuilder withRegionId(Integer regionId){
select.where(REGION_ID.field().equal(regionId));
return this;
}
public CountRatingQueryBuilder withResourceTypeId(int resourceTypeId){
select.where(RESOURCE_TYPE_ID.field().equal(resourceTypeId));
return this;
}
public CountRatingQueryBuilder withRequestTimeBetween(long beginTimestamp, long endTimestamp){
select.where(REQUEST_TIME.field().between(beginTimestamp, endTimestamp));
return this;
}
public CountRatingQueryBuilder withResourceId(int resourceId){
select.where(RESOURCE_ID.field().equal(resourceId));
return this;
}
protected void withGroupByClause(){
select.groupBy(REGION_ID.field());
select.groupBy(RESOURCE_TYPE_ID.field());
select.groupBy(RESOURCE_ID.field());
select.groupBy(CONTENT_ID.field());
}
protected void withSelectFieldsClause(){
select.select(REGION_ID.field());
select.select(RESOURCE_TYPE_ID.field());
select.select(CONTENT_ID.field());
select.select(RESOURCE_ID.field());
select.select(Factory.count(HIT_COUNT.field()).as(SUM_HIT_COUNT.fieldName()));
}
protected void withFromClause(){
select.from(SCORING_TABLE_NAME);
}
protected void withOrderByClause(){
select.orderBy(SUM_HIT_COUNT.field().desc());
}
public String build(){
withGroupByClause();
withOrderByClause();
withFromClause();
return select.getSQL().replace("offset ?","");//dirty hack for MySQL dialect. TODO: we can try to implement our own SQL dialect for Hive :)
}
public List<ResultRow> buildAndFetch(){
String sqlWithPlaceholders = build();
List<ResultRow> scoringResults = new ArrayList<ResultRow>(100);
List<Record> recordResults = create.fetch(sqlWithPlaceholders, ArrayUtils.subarray(select.getBindValues().toArray(new Object[select.getBindValues().size()]),0, select.getBindValues().size()-1));//select.fetch();
for(Record record : recordResults){
ResultRowBuilder resultRowBuilder = ResultRowBuilder.create();
resultRowBuilder.withContentType(scoringMetadata.getResourceType(record.getValue(RESOURCE_TYPE_ID.fieldName(), Integer.class)));
resultRowBuilder.withHitCount(record.getValue(SUM_HIT_COUNT.fieldName(), Long.class));
resultRowBuilder.withUrl(record.getValue(CONTENT_ID.fieldName(), String.class));
scoringResults.add(resultRowBuilder.build());
}
return scoringResults;
}
}
희망이 다음 링크에서 복사 정답입니다 : 상세이 이해할 수 jooq extend existing dialect. Adopt MySQL dialect to apache Hive dialect을 참조하시기 바랍니다.
관련 문제
- 1. 하이브의 스택 기능 : 여러 별칭을 지정하는 방법?
- 2. 하이브의 LeaseExpiredException
- 3. 하이브의 배열 배열
- 4. 하이브의 문자열 변환
- 5. 하이브의 분산 절
- 6. 하이브의 배열 리터럴
- 7. 하이브의 피벗 테이블
- 8. 하이브의 영숫자 데이터 유형
- 9. 하이브의 날짜 유형 변환
- 10. SSD로 하이브의 성능 향상
- 11. 하이브의 NULL 값 처리
- 12. 하이브의 순위 재설정
- 13. 하이브의 고유 한 열
- 14. 하이브의 스키마 정규화
- 15. 하이브의 재귀 쿼리
- 16. 하이브의 범위 파티셔닝
- 17. 변환 할 하이브의 문자열
- 18. 하이브의 불평등 조인
- 19. 하이브의 하위 쿼리
- 20. 하이브의 인덱스와 파티션
- 21. 하이브의 텍스트 비교
- 22. 하이브의 필드 정렬
- 23. 하이브의 통계 모드 계산
- 24. 하이브의 문에서 업데이트
- 25. ARRAY_CONTAINS 하이브의 다중 값
- 26. 하이브의 업데이트 문
- 27. 레지스트리와 레지스트리 하이브의 차이점
- 28. 하이브의 가입 순서
- 29. 하이브의 열에 프로젝트 배열
- 30. 하이브의 주별 계산
이것은 MySQL의 'limit 20, 30'과 같은 기능입니다. – nervosol
http://stackoverflow.com/questions/11750312/hive-ql-limiting-number-of-rows-per-each-item –