Scala 从map函数内部调用的函数返回spark rdd时出错

Scala 从map函数内部调用的函数返回spark rdd时出错,scala,apache-spark,hbase,Scala,Apache Spark,Hbase,我从hbase表中收集了一组行键植物,如下所示,我想创建一个fetchData函数,从集合中返回行键的rdd数据。目标是从fetchData方法中为plants集合中的每个元素获得RDD的联合。我已经给出了下面代码的相关部分。我的问题是,代码给出了fetchData返回类型的编译错误: printlnPartB:+hBaseRDD.getNumPartitions 错误:值getNumPartitions不是选项[org.apache.spark.rdd.rdd[it.nerdammer.spa

我从hbase表中收集了一组行键植物,如下所示,我想创建一个fetchData函数,从集合中返回行键的rdd数据。目标是从fetchData方法中为plants集合中的每个元素获得RDD的联合。我已经给出了下面代码的相关部分。我的问题是,代码给出了fetchData返回类型的编译错误:

printlnPartB:+hBaseRDD.getNumPartitions

错误:值getNumPartitions不是选项[org.apache.spark.rdd.rdd[it.nerdammer.spark.test.sys.Record]的成员

我正在使用scala 2.11.8 spark 2.2.0和maven编译

import it.nerdammer.spark.hbase._
import org.apache.spark.sql._
import org.apache.spark.sql.types.{StructType, StructField, StringType, IntegerType};
import org.apache.log4j.Level
import org.apache.log4j.Logger
import org.apache.spark.sql.SparkSession
import org.apache.spark.sql.functions._
object sys {
  case class systems( rowkey: String, iacp: Option[String], temp: Option[String])

  val spark = SparkSession.builder().appName("myApp").config("spark.executor.cores",4).getOrCreate()
  import spark.implicits._

  type Record = (String, Option[String], Option[String])

  def fetchData(plant: String): RDD[Record] = {
    val start_index = plant
    val end_index = plant + "z"
    //The below command works fine if I run it in main function, but to get multiple rows from hbase, I am using it in a separate function
    spark.sparkContext.hbaseTable[Record]("test_table").select("iacp","temp").inColumnFamily("pp").withStartRow(start_index).withStopRow(end_index)

  }

  def main(args: Array[String]) {
    //the below elements in the collection are prefix of relevant rowkeys in hbase table ("test_table") 
    val plants = Vector("a8","cu","aw","fx")
    val hBaseRDD = plants.map( pp => fetchData(pp))
    println("Part: "+ hBaseRDD.getNumPartitions)
    /*
      rest of the code
    */
  }

}
这是代码的工作版本。这里的问题是我使用for循环,我必须在每个循环中从HBase请求与rowkey plants vector对应的数据,而不是先获取所有数据,然后执行其余代码

    import it.nerdammer.spark.hbase._
    import org.apache.spark.sql._
    import org.apache.spark.sql.types.{StructType, StructField, StringType, IntegerType};
    import org.apache.log4j.Level
    import org.apache.log4j.Logger
    import org.apache.spark.sql.SparkSession
    import org.apache.spark.sql.functions._
    object sys {
      case class systems( rowkey: String, iacp: Option[String], temp: Option[String])
      def main(args: Array[String]) {
        
        val spark = SparkSession.builder().appName("myApp").config("spark.executor.cores",4).getOrCreate()
        import spark.implicits._

        type Record = (String, Option[String], Option[String])
        val plants = Vector("a8","cu","aw","fx")
        
        for (plant <- plants){
          val start_index = plant
          val end_index = plant + "z"
          val hBaseRDD = spark.sparkContext.hbaseTable[Record]("test_table").select("iacp","temp").inColumnFamily("pp").withStartRow(start_index).withStopRow(end_index)
          println("Part: "+ hBaseRDD.getNumPartitions)
          /*
            rest of the code
          */
        }
      }
    }
在REPL中定义函数并运行它

scala> val hBaseRDD = plants.map( pp => fetchData(pp)).reduceOption(_ union _)
<console>:39: error: type mismatch;
 found   : org.apache.spark.rdd.RDD[(String, Option[String], Option[String])]
 required: it.nerdammer.spark.hbase.HBaseReaderBuilder[(String, Option[String], Option[String])]
       val hBaseRDD = plants.map( pp => fetchData(pp)).reduceOption(_ union _)
提前谢谢

hBaseRDD的类型是Vector[\uux]而不是RDD[\ux],因此无法对其执行方法getNumPartitions。如果我理解正确,您希望联合获取的RDD。您可以通过plants.map pp=>fetchDatapp.reduceOption uu-union来完成,我建议使用reduceOption,因为它不会在空列表上失败,但如果您确信列表不是空的,您可以使用reduce


另外,fetchData返回的类型是RDD[U],但我没有找到任何U的定义。这可能是编译器推断Vector[Nothing]而不是Vector[RDD[Record]]的原因。为了避免后续错误,您还应该将RDD[U]更改为RDD[Record]。

消息肯定会告诉您答案。我之所以这样问,是因为我不清楚消息。所以,如果你不想回答,我不认为投反对票有什么意义。我已尝试更改fetchData函数的返回类型,但无法解决该错误。无论如何,谢谢你的反馈。我没有给min1。但是消息是清楚的,我想。稍后再看。我已经编辑了我的问题,包括工作版本,它使用for循环。是的,我想要fetchedData RDD的联合。我已经编辑了我的问题,以包含代码的工作版本。在工作版本中,hBaseRDD.getNumPartitions方法为我提供了RDD的分区。我尝试将返回类型更改为fetchData to Vector[RDD[Record]]或使用plants.map pp=>fetchDatapp.reduceOption uuu-union uu方法,但它们没有起作用。我已在最后更新了问题。现在,我正在使用reduceOption函数。我认为我很接近解决方案,请让我知道你是否可以帮助解决这个问题。谢谢
scala> val hBaseRDD = plants.map( pp => fetchData(pp)).reduceOption(_ union _)
<console>:39: error: type mismatch;
 found   : org.apache.spark.rdd.RDD[(String, Option[String], Option[String])]
 required: it.nerdammer.spark.hbase.HBaseReaderBuilder[(String, Option[String], Option[String])]
       val hBaseRDD = plants.map( pp => fetchData(pp)).reduceOption(_ union _)