Apache spark 使用spark scala批量获取HBase

Apache spark 使用spark scala批量获取HBase,apache-spark,hbase,Apache Spark,Hbase,我试图根据行键列表从HBase获取数据,在API文档中有一个名为get(list gets)的方法,我试图使用它,但是编译器抱怨类似的事情,有人有过这样的经验吗 overloaded method value get with alternatives: (x$1: java.util.List[org.apache.hadoop.hbase.client.Get])Array[org.apache.hadoop.hbase.client.Result] <and> (x$1: or

我试图根据行键列表从HBase获取数据,在API文档中有一个名为get(list gets)的方法,我试图使用它,但是编译器抱怨类似的事情,有人有过这样的经验吗

overloaded method value get with alternatives: (x$1: java.util.List[org.apache.hadoop.hbase.client.Get])Array[org.apache.hadoop.hbase.client.Result] <and> (x$1: org.apache.hadoop.hbase.client.Get)org.apache.hadoop.hbase.client.Result cannot be applied to (List[org.apache.hadoop.hbase.client.Get])

您的Get类型为List[Get]。这里的列表是Scala类型的。但是,HBase get请求需要Java列表类型。您可以使用Seq[Get]而不是List[Get],因为Scala-Seq更接近Java-List。 因此,您可以尝试使用以下代码:

val keys: List[String] = df.select("id").rdd.map(r => r.getString(0)).collect.toList
   val gets:Seq[Get]=keys.map(x=> new Get(Bytes.toBytes(x)))
   val results = hTable.get(gets)

我最终使用JavaConvert使其成为java.util.List,然后它就工作了

val gets:List[Get]=keys.map(x=> new Get(Bytes.toBytes(x)))
   import scala.collection.JavaConverters._
   val getJ=gets.asJava
   val results = hTable.get(getJ).toList

不,Seq不起作用。我最终使用了JavaConvert,我不知道为什么它不能与Seq一起工作。但是我同意,JavaConverter也应该做这项工作。对你有好处。在这种情况下,你使用的是Spark
val gets:List[Get]=keys.map(x=> new Get(Bytes.toBytes(x)))
   import scala.collection.JavaConverters._
   val getJ=gets.asJava
   val results = hTable.get(getJ).toList