筛选Spark数据集[行]开关框列值

时间:2019-08-07 12:18:13

标签: apache-spark apache-spark-sql

对于刚开始有经验的人来说,这个问题听起来可能很简单,但我要实现的目标是以下...

我当前的Dataset[Row]有一个Column('COLOR')对象,其中包含一些值redbluegreen

  

我要应用的逻辑是given a Column value, check that the Row itself, so that its Columns contain certain properties accoridng to that value.

到目前为止,我知道我可以使用Column对象并按给定条件(例如.equalTo("this").gt(new Date())过滤掉它的值,但是如果我想有条件地过滤该对象总体列基于Column中输入的可能值?

到目前为止,我一直想执行.equalTo,该值是函数的结果...

def isValid(column: Column): String = ???

如果验证通过,则内部从Column检索值,应用case并返回Column的值,如果验证通过,则返回空字符串。

也尝试在先前的方法中接收Row,但无法真正弄清楚如何使用返回row.getData()的{​​{1}}。

这对我来说似乎太过工程化了,必须有一个更简单的解决方案才能在Column中应用条件过滤。

编辑

输入

util.List[Datum]

如果我对(伪代码)进行过滤...

id,   color, fruit,      origin,  eaten
----------------------------------------
0,    red,   apple,      france,  true
1,    blue,  strawberry, spain,   *doesn't exist in this Row*

在应用过滤之后,只有color match { case 'blue' -> hasColumn('eaten') and isFruit('blueberry') case 'red' -> hasColumn('eaten') and isFruit('apple') } 应该包含在数据集中。

1 个答案:

答案 0 :(得分:0)

您可以使用UDF

/static/css/admin.css

输出:

val udf = (row: Row) => {
        val maybeFruit = getValueFromRow[String](row, "Fruit")
        getValueFromRow[String](row, "Color").exists(_ match {
          case "Red" => maybeFruit.contains("Apple")
          case "Blue" => maybeFruit.contains("Rasp")
          case "Green" => maybeFruit.contains("Grape")
        })
      }

def getValueFromRow[T](row: Row, fieldName: String): Option[T] =
      Try(row.fieldIndex(fieldName)) match {
        case Success(nodeIdx) =>
          if (!row.isNullAt(nodeIdx)) Some(row.getAs[T](nodeIdx))
          else None
        case Failure(_) => None
      }

df.filter(col("Eaten")).filter(udf).show()