Фильтрация определенной строки в куду с помощью сканера куду

Целевая таблица в kudu огромна. У меня есть следующее в scala, и я хотел бы проверить, существует ли строка в 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)) 
}
}

person user3897533    schedule 01.12.2016    source источник


Ответы (1)


Насколько я понимаю, вы ищете ровно одну запись в своей таблице. Использование сканера и определение границ и / или предела с помощью меня тоже не сработало. Вместо этого я решил проблему, определив 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, но пока не тестировал!

person Olaf H    schedule 07.12.2016