我有两个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))
答案 0 :(得分:2)
因为您从dataframe转换为rdd所以rdd的类型RDD[Row]
不是RDD[(Int, List[Int])]
。
您可以按as[(Int, List[Int])]
将数据框转换为数据集,然后按.rdd
将数据集转换为rdd,您将获得RDD[(Int, List[Int])]
。
我认为其余代码完全正常。