【问题标题】:Escape character for a String in Spark-SqlSpark-Sql中字符串的转义字符
【发布时间】:2016-03-07 19:09:02
【问题描述】:

在发布此问题之前,我阅读了 2 小时的 spark 文档。

我有一个 Spark 数据框。其中有 9 列。我想过滤 3 列(A、B、C)上的数据,其中包含字符串 - “无”。我尝试使用过滤器选项来做到这一点。它适用于单个列,但不适用于列组。

val cleanedDF = joinedDF
  .filter(joinedDF("A") !== ("None")
  .joinedDF("B") !== ("None")
  .joinedDF("C") !== ("None"))

这适用于单个列,但我如何才能为一组列提供一些东西?即仅在所有列中都有“无”时过滤掉列,如下所示。有可能吗?

val cleanedDF = joinedDF.filter(
  joinedDF("A") !== ("None") and
  joinedDF("B") !== ("None") and
  joinedDF("C") !== ("None"))

我还尝试过转换为 SQL 模板并对其进行查询。但是由于我的过滤器选项是一个字符串,所以我不能在 where 子句中使用它。谁能告诉我spark-sql 中正确的转义字符是什么?

例子:

joinedDF.registerTempTable("df")
sqlContext.sql("SELECT *  FROM df where B = `None` " ).show()

任何建议或帮助表示赞赏!

谢谢

【问题讨论】:

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


    【解决方案1】:

    使用 DataFrame API:

    val df = sc.parallelize(Seq(
      ("None", "a", "b"), ("c", "None", "d"), ("e", "f", "None"), ("g", "h", "i")
    )).toDF("A", "B", "C")
    
    df.where(($"A" !== "None") && ($"B" !== "None") && ($"C" !== "None")).show
    
    // +---+---+---+
    // |  A|  B|  C|
    // +---+---+---+
    // |  g|  h|  i|
    // +---+---+---+
    

    使用 SQL:

    df.registerTempTable("df")
    
    val query = """SELECT * FROM df 
                   WHERE A != "None" AND B != "None" AND C != "None""""
    
    sqlContext.sql(query).show
    
    // +---+---+---+
    // |  A|  B|  C|
    // +---+---+---+
    // |  g|  h|  i|
    // +---+---+---+
    

    【讨论】:

    • 非常感谢。这解决了我的问题。我也明白这也可以使用过滤器来完成,如我的问题所示。
    • 是的,这些方法在这里应该是等价的。
    猜你喜欢
    • 2015-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-19
    • 1970-01-01
    • 2021-03-26
    相关资源
    最近更新 更多