首页 > 解决方案 > 将 Spark DataFrame 值存储在 scala 变量中

问题描述

我需要检查表中的重复文件名,如果文件数为 0,那么我需要使用sparkSql. 我写了下面的代码。

    val s1=spark.sql("select count(filename) from mytable where filename='myfile.csv'") //giving '2'
    s1: org.apache.spark.sql.DataFrame = [count(filename): bigint]
    s1.show //giving 2 as output

//s1 给了我表中的文件计数,然后我需要使用 if 语句比较这个计数值。我正在使用下面的代码。

    val s2=s1.count   //not working always giving 1
    val s2=s1.head.count() // error: value count is not a member of org.apache.spark.sql.Row
    val s2=s1.size //value size is not a member of Unit
    if(s1>0){ //code } //value > is not a member of org.apache.spark.sql.DataFrame

有人可以给我一个提示我应该怎么做。我怎样才能得到数据框值并可以用作变量来检查条件。IE

    if(value of s1(i.e.2)>0){
    //my code
    }

标签: scalaapache-sparkapache-spark-sql

解决方案


您需要提取值本身。Count 将返回 df 中的行数,即只有一行。

因此,您可以保留原始查询并使用 first 和 getInt 方法提取值

val s1 = spark.sql("select count(filename) from mytable where filename='myfile.csv'")`
val valueToCompare = s1.first().getInt(0)

接着:

  if(valueToCompare>0){
    //my code
    }

另一种选择是在查询之外执行计数,然后计数将为您提供所需的值:

val s1 = spark.sql("select filename from mytable where filename='myfile.csv'")


   if(s1.count>0){
    //my code
    }

我最喜欢第二种选择,但除了我认为它更清楚之外没有其他原因


推荐阅读