两个数据帧的笛卡尔积和笛卡尔的总和导致 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.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))
因为您从数据帧转换为 rdd,所以 rdd 的类型为 RDD[Row]
而不是 RDD[(Int, List[Int])]
。
您可以通过 as[(Int, List[Int])]
将 dataframe 转换为 dataset,然后通过 .rdd
将 dataset 转换为 rdd,您将得到 RDD[(Int, List[Int])]
.
我认为其余代码将完全正常工作。
我有两个 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))
因为您从数据帧转换为 rdd,所以 rdd 的类型为 RDD[Row]
而不是 RDD[(Int, List[Int])]
。
您可以通过 as[(Int, List[Int])]
将 dataframe 转换为 dataset,然后通过 .rdd
将 dataset 转换为 rdd,您将得到 RDD[(Int, List[Int])]
.
我认为其余代码将完全正常工作。