我遇到了需要对两个sql数据帧的输出执行除法的情况。任何建议如何做?
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的收益率,我是火花壳的新手
在有多个值(即多行)的情况下:您是否有列(或键或 id)来连接两个数据帧(或表)?
在总是单个值(即单行)的情况下:类似于:100* PassDie.collect()/TotalDie.collect()
更新值为 1 时的确切语法:
100.0 * passdie.collect()(0).getInt(0) / totaldie.collect()(0).getInt(0)
res25: Double = 46.56144306651635
也可以只用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 查询进行基本的分组和算术,因为你已经有了这个大的数据表。我意识到在我的示例代码中,我并没有真正用列名声明一个好的模式,这使得这个例子并不真正有效,但你有一个模式,所以你明白了。