【问题标题】:Filtering Spark Dataset[Row] switch casing Column value过滤 Spark Dataset[Row] switch case 列值
【发布时间】:2019-08-07 12:18:13
【问题描述】:

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

我当前的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 怎么办? Column?中传入的值?

到目前为止,我的想法是执行.equalTo,其值是函数的结果...

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

它在内部从Column 中检索值,应用case 并在验证成功时返回Column 的值,如果验证出错则返回空字符串。

还尝试在前面的方法中接收Row,但无法真正弄清楚如何使用返回util.List[Datum]row.getData()

这对我来说似乎过于设计了,必须有一个更简单的解决方案来在列中应用条件过滤。

编辑

输入

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') 
}

应用过滤后,只有id == 0 应包含在数据集中。

【问题讨论】:

  • 你能分享一个输入和期望输出的例子吗?
  • @czr_RR 你也可以分享输出数据集吗?如果我的问题是正确的,这可以通过使用 case 语句轻松实现。
  • *doesn't exist in this Row* 是什么意思?
  • @ShankarKoirala 我的意思是给定字段为空,而其他行确实包含该列的值。
  • @Goldie 输出是 Nir ​​在他的回答中发布的内容。

标签: apache-spark apache-spark-sql


【解决方案1】:

你可以使用UDF

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()

输出:

+---+-----+-----+-----+------+
| ID|Fruit|Color|Eaten|Origin|
+---+-----+-----+-----+------+
|  0|Apple|  Red| true|France|
+---+-----+-----+-----+------+

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-10-12
    • 2019-11-28
    • 2018-10-02
    • 2020-10-21
    • 2022-01-25
    • 1970-01-01
    • 2017-11-17
    • 2019-04-20
    相关资源
    最近更新 更多