如何在spark中的复杂struct数据帧中绑定变量

时间:2017-07-27 06:01:41

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

我有一个像这样的代码snippit:

val filteredDF = df.filter($"abc.color".equalTo("yellow") && $"abc.height".equalTo("5")).toDF()

复杂的结构看起来像:

{
  abc:{
      color: yellow,
      height:5
  }
}

我想要的是创建一个表示abc的变量,比如说

val table_name = "abc"

并创建颜色和高度的变量,比如说

val colorField = "color"
val heightField = "height"

然后我如何修改上面的代码才能使用这些新变量?

我试过像

这样的方法
df.filter(${table_name+"."+colorField}.equalTo("yellow")

df.filter(($""+table_name+"."+colorField).equalTo("yellow")

但两者都不起作用。

1 个答案:

答案 0 :(得分:1)

您可以使用Scala的String Interpolation

val table_name = "abc"
val colorField = "color"
val heightField = "height"

df.show
+----------+
|       abc|
+----------+
|[yellow,5]|
+----------+

import org.apache.spark.sql.functions.col

df.filter(col(s"${table_name}.${colorField}").equalTo("yellow")).show

+----------+
|       abc|
+----------+
|[yellow,5]|
+----------+

df.filter(col(s"${table_name}.${colorField}").equalTo("green")).show
+---+
|abc|
+---+
+---+