2016-12-01 5 views
0

kuduのターゲットテーブルが巨大です。私はscalaに次のようなことがあります。その行がkuduに存在するかどうか確認したいと思います。これらの4つの列はkuduテーブルの主キーですが、上限を定義するとすべての行を取得するようです。kuduスキャナを使用してkuduの特定の行をフィルタリングする

kuduで特定の行を選択するにはどうすればよいですか?ここで私は1行だけが返されると期待しています。

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

私の理解から、あなたのテーブルには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に手動で移植しましたが、これまでのところテストしていません!

関連する問題