对于刚开始有经验的人来说,这个问题听起来可能很简单,但我要实现的目标是以下...
我当前的Dataset[Row]
有一个Column('COLOR')
对象,其中包含一些值red
,blue
或green
。
我要应用的逻辑是
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')
}
应该包含在数据集中。
答案 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()