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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.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 如何将数据帧转换为特定的RDD?_Scala_Apache Spark - Fatal编程技术网

Scala 如何将数据帧转换为特定的RDD?

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

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),
  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
但它将使用
属性