Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala Spark 2.3:读取rdd.map()中的数据帧_Scala_Dataframe_Apache Spark - Fatal编程技术网

Scala Spark 2.3:读取rdd.map()中的数据帧

Scala Spark 2.3:读取rdd.map()中的数据帧,scala,dataframe,apache-spark,Scala,Dataframe,Apache Spark,我希望使用.map()遍历RDD的每一行,并希望在map函数中使用dataframe,如下所示: val-rdd=…//rdd持有每行ID的序号 val df=…//列为'id:String'和'value:Double'的df` rdd .map{case行(listofstring:Seq[String])=> foldLeft(Seq[Double]())(op=(temp,curr)=>{ //在这里呼叫df val extractValue:Double=df.filter(s“id=

我希望使用
.map()
遍历RDD的每一行,并希望在map函数中使用dataframe,如下所示:

val-rdd=…//rdd持有每行ID的序号
val df=…//列为'id:String'和'value:Double'的df`
rdd
.map{case行(listofstring:Seq[String])=>
foldLeft(Seq[Double]())(op=(temp,curr)=>{
//在这里呼叫df
val extractValue:Double=df.filter(s“id==$curr”).first()(1)
温度:+提取值
}
}
上面是我编写的伪代码,这导致了一个异常,因为我无法在
.map()
中调用数据帧


我能想到的克服这一问题的唯一方法是在
.map()
之前收集
df
,这样它就不再是一个数据帧。有没有一种方法可以不用收集就能做到这一点?请注意,加入rdd和df是不合适的。

基本上你有一个rdd的ID列表
rdd[Seq[String]]
和元组的数据帧
(id,value)
。您试图用数据帧中的相应值替换RDD的id

您尝试这样做的方式在spark中是不可能的。您不能在
映射
中引用数据帧或RDD。事实上,它们是您在驱动程序中操纵的对象,用于并行作业,由工作人员执行。但是,
映射
中的代码由工作人员执行,工作人员不能将工作委托给其他工作人员。只有司机可以。这就是为什么(凭直觉)你想做的是不可能的

你说连接不合适。我不知道为什么,但这正是我所建议的,结合
flatMap
。我使用RDDAPI,但我们可以使用dataframe API编写类似的代码

//生成数据
val数据=顺序(顺序(“a”、“b”、“c”)、顺序(“d”、“e”)、顺序(“f”))
val rdd=sc.parallelize(数据)
val df=序列(“a”->1d,“b”->2d,“c”->3d,
“d”->4d,“e”->5d,“f”->6d)
.toDF(“id”、“值”)
//将数据帧转换为RDD[字符串,双精度]
val rdd_df=df.rdd
.map(row=>row.getAs[String](“id”)->row.getAs[Double](“value”))
val结果=rdd
//我们从zipWithUniqueId开始,以记住列表是如何排列的
zipWithUniqueId
//我们将列表展平,记住每一行的列表id
.flatMap{case(id,unique_id)=>ids.map(id=>id->unique_id)}
.加入(rdd_df)
.map{case(u,(unique_id,value))=>unique_id->value}
//我们通过按列表id分组来改革列表
.groupByKey
.map(u._2.toArray)
scala>result.collect
res:Array[Array[Double]=Array(Array(1.0,2.0,3.0)、Array(4.0,5.0)、Array(6.0))

“加入rdd和df不合适”-请问为什么?加入可能是最好的方式。