我正在尝试比较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
看来我必须进行一些数据转换,但无法找到适当的解决方案。
在较新版本的spark count不返回长度值中,它是在dataframe对象中收获的,即dataframe [bigint]。
您可以尝试此
val diffrence = first_table_count.first.getLong(0) - second_table_count.first.getLong(0);
和减法方法在数据框架上不可用。
您需要以下内容来进行转换:
first_table_count.first.getLong(0)
这就是为什么您需要它:数据帧代表表格数据结构。因此,尽管您的SQL似乎返回一个值,但它实际上返回包含单个行的表,并且该行包含一个列。因此,我们使用上述代码提取第一行的第一列(索引0)。