Scala:对查询输出执行比较

时间:2016-12-23 21:25:00

标签: scala apache-spark-sql

我正在尝试比较2个不同查询/表的计数。是否可以在Scala(Spark SQL)中执行此操作?

这是我的代码:

val parquetFile1 = sqlContext.read.parquet("/user/njrbars2/ars/mbr_addr/2016/2016_000_njars_09665_mbr_addr.20161222031015221601.parquet") 
val parquetFile2 =sqlContext.read.parquet("/user/njrbars2/ars/mbr_addr/2017/part-r-00000-70ce4958-57fe-487f-a45b-d73b7ef20289.snappy.parquet")
parquetFile1.registerTempTable("parquetFile1")
parquetFile2.registerTempTable("parquetFile2")

scala> var first_table_count=sqlContext.sql("select count(*) from parquetFile1")
first_table_count: org.apache.spark.sql.DataFrame = [_c0: bigint]

scala> var second_table_count=sqlContext.sql("select count(*) from parquetFile1 where LINE1_ADDR is NULL and LINE2_ADDR is NULL")
second_table_count: org.apache.spark.sql.DataFrame = [_c0: bigint]

scala> first_table_count.show()
+------+
|   _c0|
+------+
|119928|
+------+

scala> second_table_count.show()
+---+
|_c0|
+---+
|617|
+---+

我试图获得这两个查询的差异值,但却收到错误。

scala> first_table_count - second_table_count
<console>:30: error: value - is not a member of org.apache.spark.sql.DataFrame
              first_table_count - second_table_count

然而,如果我做正常的减法,它就会起作用

scala> 2 - 1
res7: Int = 1

我似乎必须进行一些数据转换,但无法找到合适的解决方案。

2 个答案:

答案 0 :(得分:0)

您需要执行以下操作才能进行转换:

first_table_count.first.getLong(0)

这就是你需要它的原因: DataFrame表示表格数据结构。因此,尽管您的SQL似乎返回单个值,但它实际上返回包含单个行的表,并且该行包含单个列。因此,我们使用上面的代码来提取第一行的第一列(索引0)。

答案 1 :(得分:0)

在较新版本的spark count中,不返回Long值,而是在数据帧对象内部获取,即Dataframe [BigInt]。

你可以试试这个

val diffrence = first_table_count.first.getLong(0) - second_table_count.first.getLong(0);

并且数据框架上没有减法方法。