【问题标题】:Storing Spark DataFrame Value In scala Variable将 Spark DataFrame 值存储在 scala 变量中
【发布时间】:2020-04-12 21:17:19
【问题描述】:

我需要检查我的表中的重复文件名,如果文件计数为 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

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

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

【问题讨论】:

  • 您或许应该再次阅读一下 SQL 中的聚合函数的作用以及数据帧上的 count 的作用。

标签: scala apache-spark apache-spark-sql


【解决方案1】:

spark.sql("select count(filename) from mytable where filename='myfile.csv'") 返回一个数据框,您需要提取该行的第一行和第一列。在Scala中直接过滤数据集并统计行数要简单得多:

val s1 = df.filter($"filename" === "myfile.csv").count
if (s1 > 0) {
  ...
}

其中df 是与mytable 表对应的数据集。

如果您从其他来源获取表,而不是通过注册视图,请使用 SparkSession.table() 使用您已有的 SparkSession 实例获取数据框。例如,在 Spark shell 中,预设变量 spark 保存会话,您将执行以下操作:

val df = spark.table("mytable")
val s1 = df.filter($"filename" === "myfile.csv").count

【讨论】:

    【解决方案2】:

    您需要提取值本身。 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
        }
    

    我最喜欢第二个选项,但没有其他理由我认为它更清楚

    【讨论】:

      猜你喜欢
      • 2017-05-20
      • 2017-11-19
      • 1970-01-01
      • 2013-01-31
      • 2018-09-29
      • 1970-01-01
      • 2022-07-08
      • 1970-01-01
      • 2016-05-25
      相关资源
      最近更新 更多