Scala 从map函数内部调用的函数返回spark rdd时出错
我从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编译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
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 _)