Scala 如何在没有嵌套转换的情况下创建新的RDD

Scala 如何在没有嵌套转换的情况下创建新的RDD,scala,csv,apache-spark,rdd,Scala,Csv,Apache Spark,Rdd,我想用以下格式的记录创建RDD: (行程,(起点站详细信息),(终点站详细信息)) 最后第二行失败,出现以下错误: org.apache.spark.SparkException:RDD转换和操作只能由驱动程序调用,不能在其他转换内部调用;例如,rdd1.map(x=>rdd2.values.count()*x)无效,因为无法在rdd1.map转换内部执行值转换和计数操作 实现这一目标的正确而有效的方法是什么 stations.csv: station_id,name,lat,long,dock

我想用以下格式的记录创建RDD:

(行程,(起点站详细信息),(终点站详细信息))

最后第二行失败,出现以下错误:

org.apache.spark.SparkException:RDD转换和操作只能由驱动程序调用,不能在其他转换内部调用;例如,rdd1.map(x=>rdd2.values.count()*x)无效,因为无法在rdd1.map转换内部执行值转换和计数操作

实现这一目标的正确而有效的方法是什么

stations.csv:

station_id,name,lat,long,dockcount,landmark,installation,notes
2,San Jose Diridon Caltrain Station,37.329732,-121.901782,27,San Jose,8/6/2013,
3,San Jose Civic Center,37.330698,-121.888979,15,San Jose,8/5/2013,
...
trips.csv:

Trip ID,Duration,Start Date,Start Station,Start Terminal,End Date,End Station,End Terminal,Bike #,Subscription Type,Zip Code
4258,114,8/29/2013 11:33,San Jose City Hall,10,8/29/2013 11:35,MLK Library,11,107,Subscriber,95060
4265,151,8/29/2013 11:40,San Francisco City Hall,58,8/29/2013 11:42,San Francisco City Hall,58,520,Subscriber,94110
...

stations.csv中的station\u id与trips.csv中的开始终端(索引4)和结束终端(索引7)匹配有两种方法。此外,请阅读Shaido的评论以使用Dataframe

val bcStations = sc.broadcast(stations.collectAsMap)

val joined = trips.map(trip =>{
    (trip, bcStations.value.getOrElse(trip(4).toInt, Nil), bcStations.value.getOrElse(trip(7).toInt, Nil))
})

println(joined.toDebugString)

joined.take(1)

val mapStations = stations.collectAsMap

val joinedtrips = trips.map(trip => {
    (trip, mapStations.getOrElse(trip(4).toInt, Nil), mapStations.getOrElse(trip(7).toInt, Nil))
})

joinedtrips.take(1)

您为什么不使用较新的DataFrame API(它更易于使用且更清晰)?您好,Shaido,感谢您将问题编辑为更好的格式。这是我正在学习的一些材料。它还没有涵盖DataFrame,但我将研究它。感谢您分享这个想法。对于RDD或dataframe,您要做的是使用
join
。这里可以看到一些关于如何在RDD上实现的示例:为什么不使用带有ur头行的过滤条件,如。过滤器(×=》!x.contains(“站点id、名称、纬度、长度、dockcount、landmark”)。这是一个简单的技巧
val bcStations = sc.broadcast(stations.collectAsMap)

val joined = trips.map(trip =>{
    (trip, bcStations.value.getOrElse(trip(4).toInt, Nil), bcStations.value.getOrElse(trip(7).toInt, Nil))
})

println(joined.toDebugString)

joined.take(1)

val mapStations = stations.collectAsMap

val joinedtrips = trips.map(trip => {
    (trip, mapStations.getOrElse(trip(4).toInt, Nil), mapStations.getOrElse(trip(7).toInt, Nil))
})

joinedtrips.take(1)