0

Seq[String]Stringとして格納されたlistAvalBの2つの列を持つデータフレームがあります。CASE文で配列型の列値を使用する方法

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

しかし、スパークは、これを実行に失敗し、次のエラーを与えた:私は、次の操作を実行しようとした私は、int型のものであろう3列目valCを、作成したいと、その値は
iff valB is present in listA then 1 otherwise 0

です:

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

CASE文でどのように配列型の列値を使用しますか?

おかげで、 Devj

答えて

1

要素が配列中に存在しているかどうかをチェックする単純な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| 
+---+---------+-------+ 
2

あなたが使用する必要がありarray_contains

import org.apache.spark.sql.functions.{expr, array_contains} 

df.withColumn("valC", when(expr("array_contains(listA, valB)"), 1).otherwise(0)) 
関連する問題