【问题标题】:in scala how to convert the result in sql query row to double在scala中如何将sql查询行中的结果转换为double
【发布时间】:2020-02-24 08:59:41
【问题描述】:

我尝试获取 spark sql 查询的结果并在 Scala 中为它们做一些计算。

 val sql_DF = spark.sql("SELECT count(distinct(my_id)) total_id FROM some_ids_table ")

 val total_ids = sql_DF.select("total_id").first().toSeq.asInstanceOf[Seq[Double]][0]


 val sql_DF01 = spark.sql("SELECT count(distinct(other_id)) other_ids FROM some_ids_table where column_value1 = 1")

 val  other_id_1 = sql_DF01.select("other_ids").first().toSeq.asInstanceOf[Seq[Double]][0]

 println(other_id_1/total_ids)

我收到错误:

 error: identifier expected but integer literal found.
 val total_ids = sql_DF.select("total_id").first().toSeq.asInstanceOf[Seq[Double]][0]

如何将 sql 查询行中的结果转换为 double 以便我可以对它们进行一些数学计算? 例如

   other_ids / total_ids

谢谢

【问题讨论】:

    标签: sql scala apache-spark


    【解决方案1】:

    您可以使用如下的 CAST 函数

    scala>  val sql_DF = spark.sql("SELECT count(distinct(eid)) total_id FROM employee ")
    sql_DF: org.apache.spark.sql.DataFrame = [total_id: bigint]
    

    使用 CAST 函数将 bigint 转换为 double

    scala>  val sql_DF = spark.sql("SELECT CAST(count(distinct(eid)) AS DOUBLE) total_id FROM employee ")
    sql_DF: org.apache.spark.sql.DataFrame = [total_id: double]
    

    【讨论】:

    • 我收到错误:“other_id_1/total_ids”中的“/”不是 org.apache.spark.sql.Row var tmp = round_up(other_id_1/other_id) * 100 的成员。它似乎“other_id_1”的值在sql查询结果中仍然是一行的格式,而不是数字。
    • 你能打印出架构吗?为什么会有 Row 类型的列?
    【解决方案2】:

    这个问题对我来说似乎不是很清楚。以下是您通常如何处理以下情况。

    import spark.implicits._ val df = Seq(("a",90.0),("b",30.0)).toDF("name","marks")

    收集“marks”列中的数据,类型为'Array[Row]'

    val rows: Array[Row] = df.select("marks").collect()

    您特别需要使用 map 获取每个元素,并根据列中的数据类型为其指定类型。

    val values: Array[Double] = rows.map(row => row.getAs[Double](0)/*row.getDouble(0)*/)

    【讨论】:

      【解决方案3】:

      你的问题有不同的观点。如果您想获取不同 'my_id' 的计数并将其分配给一个值,您可以直接使用:

      total_ids = sql_DF.dropDuplicates("my_id").count()
      

      您得到的错误是由于从 DF 访问数据的方式(您需要访问行对象:https://spark.apache.org/docs/1.6.1/api/java/org/apache/spark/sql/Row.html)。

      替代方案:您可以使用.as[DataType] 直接投射您的DF,如下所示:

      val total_id = sql_DF.selectExpr("count(distinct(my_id)) as total_id").as[Long].first()
      

      【讨论】:

      • 我跟进spark.apache.org/docs/1.6.1/api/java/org/apache/spark/sql/…),但是,我得到了错误: value / is not a member of org.apache.spark.rdd.RDD[Double] 。当我尝试对分子和分母进行除法时,它们都是 RDD[Double]
      • 你能分享一个代码sn-p吗?基本上,您需要首先提取值,具体取决于您在DF 中的类型。是这样的:val numerator = sql_DF.selectExpr("count(distinct(my_id)) as total_id").as[Long].first()val denominator = another_DF.selectExpr("count(distinct(my_id)) as total_id").as[Long].first()val res = numerator.toDouble / denominator.toDouble其中,你先得到numeratordenominator,然后执行操作。
      猜你喜欢
      • 2015-02-04
      • 2012-12-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-13
      • 2020-08-22
      相关资源
      最近更新 更多