两个Dataframes的笛卡尔积和Cartesion的总和导致Spark(scala)?

时间:2017-11-08 10:05:27

标签: scala apache-spark apache-spark-sql spark-dataframe scala-collections

我有两个DataFrame'(Spark scala),如下面:

df1 is Array((1,WrappedArray(1,2,3)),(2,WrappedArray(1,2,4)))
org.apache.spark.sql.DataFrame = [id: int, features: array<float>]

df2 is Array((1,WrappedArray(4,5,6)),(2,WrappedArray(3,5,6)))

首先我必须产生笛卡尔和上述两个df的数组值的总和。

例如笛卡尔式如下:

((11,(Array(1,2,3),Array(4,5,6))),(12,(Array(1,2,3),Array(3,5,6))),(21,(Array(1,2,4),Array(4,5,6))),(22,(Array(1,2,4),Array(3,5,6))))

笛卡尔和总和如下:

数组((11,1 * 4 + 2 * 5 + 3 * 6),(12,1 * 3 + 2 * 5 + 3 * 6),(21,(1 * 4 + 2 * 5 + 4) * 6))(22,(1 * 3 + 2 * 5 + 4 * 6))

我试过像下面的笛卡尔:

scala> val cart=df1.cartesian(df2)

但我收到错误

<console>:41: error: value cartesian is not a member of org.apache.spark.sql.DataFrame

之后我使用RDD.i.e df.rdd将df转换为rdd 之后我尝试了ufrdd.cartesian(miftrdd).map{ case ((k1, v1), (k2, v2)) => (((k1.toString).zip(k2.toString))) -> v1.zip(v2).map(x => x._1 * x._2).reduce(_ + _) }.foreach(println) 但我得到的错误就像

 error: constructor cannot be instantiated to expected type;
 found   : (T1, T2)
 required: org.apache.spark.sql.Row

请帮我解决这个问题

数组((11,1 * 4 + 2 * 5 + 3 * 6),(12,1 * 3 + 2 * 5 + 3 * 6),(21,(1 * 4 + 2 * 5 + 4) * 6))(22,(1 * 3 + 2 * 5 + 4 * 6))

1 个答案:

答案 0 :(得分:2)

因为您从dataframe转换为rdd所以rdd的类型RDD[Row]不是RDD[(Int, List[Int])]。 您可以按as[(Int, List[Int])]将数据框转换为数据集,然后按.rdd将数据集转换为rdd,您将获得RDD[(Int, List[Int])]

我认为其余代码完全正常。