我正在尝试比较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
我似乎必须进行一些数据转换,但无法找到合适的解决方案。
答案 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);
并且数据框架上没有减法方法。