2016-12-01 2 views
0

Целевая таблица в kudu огромна. У меня есть следующее в scala, и я хотел бы проверить, существует ли строка в kudu. Эти четыре столбца являются первичными ключами в таблице kudu, но когда я определяю верхнюю границу, я, кажется, получаю все строки.Фильтрация определенной строки в kudu с помощью сканера kudu

Как выбрать конкретную строку в kudu? Здесь я ожидаю возвращения только одной строки.

val table2 : KuduTable = kuduClient.openTable("event-sets") 
    val eventColumns: util.List[String] = List(
     OccurrenceSchema.SetId.name, 
     OccurrenceSchema.Period.name, 
     OccurrenceSchema.Event.name, 
     OccurrenceSchema.Date.name).asJava 

    val end:PartialRow = table2.getSchema.newPartialRow() 
    end.addInt(OccurrenceSchema.Period.name,1476) 
    end.addInt(OccurrenceSchema.SetId.name,82) 
    end.addInt(OccurrenceSchema.Event.name,3195167) 
    end.addLong(OccurrenceSchema.Date.name,1367922840000L) 

    val kuduScanner: KuduScanner = kuduClient.newScannerBuilder(table2) 
     .setProjectedColumnNames(eventColumns) 
     .lowerBound(end) 
     .exclusiveUpperBound((end)) 
     .build() 

    assert(kuduScanner.hasMoreRows) 
    while (kuduScanner.hasMoreRows) { 
     val resultIterator: RowResultIterator = kuduScanner.nextRows() 
     while (resultIterator.hasNext) { 
     val result: RowResult = resultIterator.next() 
     assert(result != null) 
     logger.info(" : SetId Value -- " + result.getInt(OccurrenceSchema.SetId.name)) 
     logger.info(" : Period Value -- " + result.getInt(OccurrenceSchema.Period.name)) 
     logger.info(" : Event Value -- " + result.getInt(OccurrenceSchema.Event.name)) 
     logger.info(" : Date Value -- " + result.getLong(OccurrenceSchema.Date.name)) 
} 
} 

ответ

1

С моей точки зрения, вы ищете eaxcly одну запись в своем столе. Использование сканера и определение границ и/или ограничение с меня тоже не сработало. Вместо этого я решил проблему, определив KuduPredicate. Ниже вы найдете мое решение.

val builder: KuduScannerBuilder = kuduClient.newScannerBuilder(table2) 
// define columns, you want to select 
builder.setProjectedColumnNames(eventColumns) 

// add predicates to select a record by primary key 
val pkPeriod: KuduPredicate = KuduPredicate.newComparisonPredicate(OccurrenceSchema.Period.name), KuduPredicate.ComparisonOp.EQUAL, 1476) 
builder.addPredicate(pkPeriod) 
val pkSetId: KuduPredicate = KuduPredicate.newComparisonPredicate(OccurrenceSchema.SetId.name), KuduPredicate.ComparisonOp.EQUAL, 82) 
builder.addPredicate(pkSetId) 
val pkEvent: KuduPredicate = KuduPredicate.newComparisonPredicate(OccurrenceSchema.Event.name), KuduPredicate.ComparisonOp.EQUAL, 3195167) 
builder.addPredicate(pkEvent) 
val pkDate: KuduPredicate = KuduPredicate.newComparisonPredicate(OccurrenceSchema.Date.name), KuduPredicate.ComparisonOp.EQUAL, 1367922840000L) 
builder.addPredicate(pkDate) 

val kuduScanner: KuduScanner = builder.build() 

while (kuduScanner.hasMoreRows) { 
    val resultIterator: RowResultIterator = kuduScanner.nextRows() 
    while (resultIterator.hasNext) { 
    val result: RowResult = resultIterator.next() 

    // do whatever you have to do with the selected record 
    logger.info(" : SetId Value -- " + result.getInt(OccurrenceSchema.SetId.name)) 
    } 
} 

Я новичок в Kudu, поэтому я не уверен, является ли это решение наиболее эффективным. По крайней мере, он возвращает ожидаемый результат.

Мой первоначальный код написан и протестирован на Java. Я портировал его вручную на Scala, но я до сих пор не тестировал его!

Смежные вопросы