我遇到了需要对两个sql Data Frame的输出进行除法的情况。任何建议如何做到这一点?
scala> val TotalDie = sqlc.sql("select COUNT(DISTINCT XY) from Data")
TotalDie: org.apache.spark.sql.DataFrame = [_c0: bigint]
scala> TotalDie.show()
+---+
|_c0|
+---+
|887|
+---+
scala> val PassDie = sqlc.sql("select COUNT(DISTINCT XY) from Data where Sbin = '1'")
PassDie: org.apache.spark.sql.DataFrame = [_c0: bigint]
scala> PassDie.show()
+---+
|_c0|
+---+
|413|
+---+
我需要执行以计算参考(PassDie / TotalDie)* 100的收益率, 我是spark-shell的新手
答案 0 :(得分:1)
如果有多个值(即多行):您是否有一个列(或键或id)来连接两个数据帧(或表)?
如果总是单个值(即单行):类似于以下内容:100 * PassDie.collect()/ TotalDie.collect()
<强>更新强>
1值的确切语法:
100.0 * passdie.collect()(0).getInt(0) / totaldie.collect()(0).getInt(0)
res25: Double = 46.56144306651635
答案 1 :(得分:0)
也可以只用SparkSQL来做到这一点。
这就是我要用这样解决的方法:
>>> rdd1 = sc.parallelize([("a",1.12),("a",2.22)])
>>> rdd2 = sc.parallelize([("b",9.12),("b",12.22)])
>>> r1df = rdd1.toDF()
>>> r2df = rdd2.toDF()
>>> r1df.registerTempTable('r1')
>>> r2df.registerTempTable('r2')
>>> r3df = sqlContext.sql("SELECT * FROM r1 UNION SELECT * FROM r2").show()
>>> r3df.registerTempTable('r3')
>>> sqlContext.sql("SELECT * FROM r3") -------> do your aggregation / math here.
现在从理论上讲,你可以使用SQL查询进行基本的分组和算术,因为你已经拥有了这个宏大的数据表。我在我的示例代码中意识到,我并没有真正声明一个带有列名的好架构,这使得这个示例不能正常工作,但是你有一个架构,所以你明白了。