Sql DataFrame - 操作

Sql DataFrame - Operation

我遇到了需要对两个 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 的收益率, 我是 spark-shell

的新手

如果有多个值(即多行):您是否有列(或键或 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 查询就可以进行基本的分组和算术运算,因为您拥有如此庞大的 table 数据。我在我的示例代码中意识到,我并没有真正声明一个带有列名的好的模式,这使得这个例子实际上不起作用,但你有一个模式,所以你明白了。