两个数据帧的笛卡儿乘积和笛卡儿分解的和在Spark(scala)中产生



我有两个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将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))

因为您从数据帧转换为rdd,所以rdd的类型是RDD[Row]而不是RDD[(Int, List[Int])]。您可以通过as[(Int, List[Int])]将数据帧转换为数据集,然后通过.rdd将数据集转换为rdd,得到RDD[(Int, List[Int])]

我认为其余的代码将完全正常工作。

相关内容

  • 没有找到相关文章

最新更新