【问题标题】:Apply SQL functions from within a DataFrame从 DataFrame 中应用 SQL 函数
【发布时间】:2016-02-18 02:40:35
【问题描述】:

以下在 Spark SQL 中起作用:

val df = sqlc.sql(
  "select coalesce(optPrefix.optSysIp,'--') as ip, count(1) as cnt
  from llines group by coalesce(optPrefix.optSysIp,'--')"
).collect

 res39: Array[org.apache.spark.sql.Row] = Array([192.168.1.7,57],[--,43]))

我们如何直接从数据帧应用合并?

scala> df.groupBy("coalesce(optPrefix.optSysIp,'--')").count.collect
org.apache.spark.sql.AnalysisException: Cannot resolve column name 
 "coalesce(optPrefix.optSysIp,'--')

我查看了数据框上有哪些方法。我无法辨别运行此合并操作的任何方法。想法?

【问题讨论】:

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


    【解决方案1】:

    你可以使用coalesce函数:

    import org.apache.spark.sql.functions.{coalesce, lit}
    
    case class Foobar(foo: Option[Int], bar: Option[Int])
    
    val df = sc.parallelize(Seq(
      Foobar(Some(1), None), Foobar(None, Some(2)),
      Foobar(Some(3), Some(4)), Foobar(None, None))).toDF
    
    df.select(coalesce($"foo", $"bar", lit("--"))).show
    
    // +--------------------+
    // |coalesce(foo,bar,--)|
    // +--------------------+
    // |                   1|
    // |                   2|
    // |                   3|
    // |                  --|
    // +--------------------+
    

    【讨论】:

    • thx 实际上我尝试过类似的东西,但它不适用于文字,似乎只有列。即:尝试用“--”替换$“bar”。无论如何我都赞成,因为你的评论很有帮助。
    • 那是一个非常有用的小交流。感谢您的光临。
    猜你喜欢
    • 2018-02-23
    • 2021-12-23
    • 2021-09-10
    • 1970-01-01
    • 2016-05-15
    • 2019-04-10
    • 2021-10-04
    • 2017-11-14
    • 2013-11-30
    相关资源
    最近更新 更多