【问题标题】:How to use array type column value in CASE statement如何在 CASE 语句中使用数组类型的列值
【发布时间】:2019-01-14 23:57:01
【问题描述】:

我有一个包含两列的数据框,listA 存储为Seq[String]valB 存储为String。我想创建第三列valC,它将是Int类型,其值为
iff valB is present in listA then 1 otherwise 0

我尝试了以下操作:

val dfWithAdditionalColumn = df.withColumn("valC", when($"listA".contains($"valB"), 1).otherwise(0))

但 Spark 未能执行此操作并给出以下错误:

cannot resolve 'contains('listA', 'valB')' due to data type mismatch: argument 1 requires string type, however, 'listA' is of array type.;

如何在 CASE 语句中使用数组类型的列值?

谢谢, 开发者

【问题讨论】:

    标签: apache-spark apache-spark-sql pyspark-sql


    【解决方案1】:

    你应该使用array_contains:

    import org.apache.spark.sql.functions.{expr, array_contains}
    
    df.withColumn("valC", when(expr("array_contains(listA, valB)"), 1).otherwise(0))
    

    【讨论】:

      【解决方案2】:

      您可以编写一个简单的 udf 来检查该元素是否存在于数组中:

      val arrayContains = udf( (col1: Int, col2: Seq[Int]) => if(col2.contains(col1) ) 1 else 0 )
      

      然后只需调用它并以正确的顺序传递必要的列:

      df.withColumn("hasAInB", arrayContains($"a", $"b" ) ).show
      
      +---+---------+-------+
      |  a|        b|hasAInB|
      +---+---------+-------+
      |  1|   [1, 2]|      1|
      |  2|[2, 3, 4]|      1|
      |  3|   [1, 4]|      0|
      +---+---------+-------+
      

      【讨论】:

        猜你喜欢
        • 2017-02-28
        • 1970-01-01
        • 2017-11-05
        • 2017-02-07
        • 2020-03-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-04-23
        相关资源
        最近更新 更多