[英]Error in returning spark rdd from a function called inside the map function
我有一个来自 hbase 表的行键集合(如下所示的植物),我想创建一个 fetchData 函数,该函数从集合中返回行键的 rdd 数据。 目标是从植物集合的每个元素的 fetchData 方法中获得 RDD 的联合。 我在下面给出了代码的相关部分。 我的问题是,代码给出了 fetchData 返回类型的编译错误:
println("PartB:"+ hBaseRDD.getNumPartitions)
错误:值 getNumPartitions 不是 Option[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(植物)向量对应的数据,而不是先获取所有数据,然后执行其余代码
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
*/
}
}
}
经过尝试,这就是我现在卡住的地方。 那么如何将类型转换为 required.
scala> def fetchData(plant: String) = {
| val start_index = plant
| val end_index = plant + "~"
| val x1 = spark.sparkContext.hbaseTable[Record]("test_table").select("iacp","temp").inColumnFamily("pp").withStartRow(start_index).withStopRow(end_index)
| x1
| }
在 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[_]
而不是RDD[_]
,所以你不能在它上面执行getNumPartitions
方法。 如果我理解正确,您想联合获取的 RDD。 您可以通过plants.map( pp => fetchData(pp)).reduceOption(_ union _)
(我建议使用reduceOption
因为它不会在空列表上失败,但是如果您确信该列表,您可以使用reduce
不为空)
fetchData
的返回类型也是RDD[U]
,但我没有找到U
任何定义。 可能这就是编译器推断Vector[Nothing]
而不是Vector[RDD[Record]]
。 为了避免后续错误,您还应该将RDD[U]
更改为RDD[Record]
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.