如何使用字符串数组过滤sparkDataframe中的列?

iyfamqjs  于 2021-05-19  发布在  Spark
关注(0)|答案(2)|浏览(609)

我必须使用数组[string]过滤sparkDataframe中的一列
我有一个如下的参数文件,

  1. variable1=100,200

我读取参数文件并按“=”分割每一行,然后加载到map[string,string]中,为了得到值,我传递键“varaible1”,并按“,”分割值

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

现在我需要在过滤Dataframe时使用这个value1。

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

我得到下面的错误,

  1. org.apache.spark.sql.catalyst.parser.ParseException:
  2. mismatched input '(' expecting <EOF>(line 1, pos 12)
  3. == SQL ==
  4. column1 in ([Ljava.lang.String;@760b9444) and column2 in ([Ljava.lang.String;@5397d41e)
  5. ------------^^^

有什么建议吗?

w3nuxt5m

w3nuxt5m1#

要按数组筛选列,可以使用 isin 列方法:

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

nhaq1z212#

您可以像以前一样使用数组过滤列。要更正sql表达式,需要做两件事。
首先,您忘了在表示sql表达式的字符串的开头添加“s”字符串插值器,如下所示:

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

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

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

在你的阵型上 Array("100", "200") ,此方法将返回字符串 "'100','200'" 如果我们把所有东西都包起来,我们会得到以下表达式:

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

相关问题