Sql DataFrame - 操作

时间:2016-07-14 08:34:53

标签: sql apache-spark dataframe spark-dataframe

我遇到了需要对两个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的新手

2 个答案:

答案 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查询进行基本的分组和算术,因为你已经拥有了这个宏大的数据表。我在我的示例代码中意识到,我并没有真正声明一个带有列名的好架构,这使得这个示例不能正常工作,但是你有一个架构,所以你明白了。