【问题标题】:How to filter a column in Spark dataframe using a Array of strings?如何使用字符串数组过滤 Spark 数据框中的列?
【发布时间】:2021-01-30 08:28:49
【问题描述】:

我必须使用 Array[String] 过滤 spark 数据框中的一列

我有一个像下面这样的参数文件,

variable1=100,200

我读取参数文件并用“=”分割每一行并加载到 Map[String,String] 为了获取值,我传递了键“varaible1”并用“,”分割值

val value1:Array[String] = parameterValues("varaible1").split(",")

现在我需要在过滤数据帧时使用这个 value1。

val finalDf = testDf.filter("column1 in ($value1) and column2 in ($value1)")

我收到以下错误,

org.apache.spark.sql.catalyst.parser.ParseException: 
mismatched input '(' expecting <EOF>(line 1, pos 12)

== SQL ==
column1 in ([Ljava.lang.String;@760b9444) and column2 in ([Ljava.lang.String;@5397d41e)
------------^^^

有什么建议吗?

【问题讨论】:

    标签: sql scala dataframe apache-spark


    【解决方案1】:

    要按数组过滤列,可以使用isin列方法:

    import org.apache.spark.sql.functions.col
    
    val finalDf = testDf.filter(col("column1").isin(value1: _*) && col("column2").isin(value1: _*))
    

    【讨论】:

      【解决方案2】:

      您可以像之前那样使用数组过滤列。要更正 SQL 表达式,您需要做两件事。

      首先,您忘记将“s”字符串插值器放在代表 SQL 表达式的字符串的开头,如下所示:

      s"column1 in ($value1) and column2 in ($value1)"
      

      然后,您需要将Array[String] 转换为格式良好的字符串,该字符串将被理解为SQL 数组。为此,您可以在 value1 数组上使用 mkString 方法:

      value1.mkString("'", "','","'")
      

      在您的数组Array("100", "200") 上,此方法将返回字符串"'100','200'"

      如果我们把所有东西都包装起来,我们会得到以下表达式:

      val finalDf = testDf.filter(s"column1 in (${value1.mkString("'", "','","'")}) and column2 in (${value1.mkString("'", "','","'")})")
      

      【讨论】:

        猜你喜欢
        • 2023-01-15
        • 1970-01-01
        • 1970-01-01
        • 2018-12-29
        • 2022-07-01
        • 1970-01-01
        • 2023-01-31
        • 1970-01-01
        • 2019-12-27
        相关资源
        最近更新 更多