Scala 如何将数据帧转换为特定的RDD?
Spark 2.2中有以下数据帧:Scala 如何将数据帧转换为特定的RDD?,scala,apache-spark,Scala,Apache Spark,Spark 2.2中有以下数据帧: df = v_in v_out 123 456 123 789 456 789 此df定义图形的边。每行是一对顶点。我想提取边数组,以便创建边的RDD,如下所示: val edgeArray = Array( Edge(2L, 1L, 0.0), Edge(2L, 4L, 0.2), Edge(3L, 2L, 0.9), Edge(3L, 6L, 0.1), Edge(4L, 1L, 0.0
df =
v_in v_out
123 456
123 789
456 789
此df
定义图形的边。每行是一对顶点。我想提取边数组,以便创建边的RDD
,如下所示:
val edgeArray = Array(
Edge(2L, 1L, 0.0),
Edge(2L, 4L, 0.2),
Edge(3L, 2L, 0.9),
Edge(3L, 6L, 0.1),
Edge(4L, 1L, 0.0),
Edge(5L, 2L, 0.8),
Edge(5L, 3L, 0.7),
Edge(5L, 6L, 0.5)
)
val spark = SparkSession.builder()
.appName("ES")
.master("local[*]")
.getOrCreate()
implicit val sparkContext = spark.sparkContext
val edgeRDD: RDD[Edge[Double]] = sparkContext.parallelize(edgeArray)
如何使用df
获得相同结构的edgerray
?在每条边中,第三个值可以是0到1之间的任意随机双精度值
更新:
我是这样做的,但不确定这是否是最佳解决方案:
val edgeArray = df.rdd.collect().map(row => Edge(row.get(0).toString.toLong, row.get(1).toString.toLong, 0.0))
val edgeRDD: RDD[Edge[Double]] = sparkContext.parallelize(edgeArray)
我不喜欢使用数组
,因为我可能有数百万条边。我可以更直接地将数据帧传递给RDD吗
val df = Seq((123, 456), (123, 789), (456, 789)).toDF("v_in", "v_out")
进口
import org.apache.spark.sql.functions.rand
import org.apache.spark.graphx.Edge
并转换为:
val edgeRDD = df.toDF("srcId", "dstId")
.withColumn("attr", rand)
.as[Edge[Double]].rdd
使用图形框架
:
spark.jars.packages graphframes:graphframes:X.X.X-sparkY.Y-s_Z.ZZ
如果X.X.X
是软件包版本,Y.Y
是Spark版本,Z.ZZ
是Scala版本,您可以这样创建图形
:
GraphFrame.fromEdges(df.toDF("src", "dst")).toGraphX
但它将使用行
属性。给定
val df = Seq((123, 456), (123, 789), (456, 789)).toDF("v_in", "v_out")
进口
import org.apache.spark.sql.functions.rand
import org.apache.spark.graphx.Edge
并转换为:
val edgeRDD = df.toDF("srcId", "dstId")
.withColumn("attr", rand)
.as[Edge[Double]].rdd
使用图形框架
:
spark.jars.packages graphframes:graphframes:X.X.X-sparkY.Y-s_Z.ZZ
如果X.X.X
是软件包版本,Y.Y
是Spark版本,Z.ZZ
是Scala版本,您可以这样创建图形
:
GraphFrame.fromEdges(df.toDF("src", "dst")).toGraphX
但它将使用行
属性