繁体   English   中英

两个数据框的笛卡尔乘积与Spark(scala)的笛卡尔结果之和?

[英]Cartesian product of two Dataframes and Sum of the cartesion result in 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.ie 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,您将获得RDD[(Int, List[Int])]

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM