使用Spark中的“when”函数填充数据帧

时间:2017-04-24 14:10:06

标签: scala apache-spark spark-dataframe

我有一个看起来像这样的数据框

 df1:
 image-id  colorList
 -------------------------
 id1       [Red,Blue]  
 id2       [White,Grey]      

现在我想使用df1创建一个新的Dataframe,看起来像这样

 df2:
 image-id  isRed  isBlue  isWhite  isGrey
 ----------------------------------------
 id1       1      1       0        0
 id2       0      0       1        1 

我正在尝试使用以下代码,但由于类型不匹配而无法正常工作

val df2 = df1.withColumn("image-id",$"image-id")
.withColumn("isRed", when($"colorList" contains "Red",1).otherwise(0))

我试过了

val df2 = df1.withColumn("image-id",$"image-id")
.withColumn("isRed", when($"colorList" contains Seq("Red"),1).otherwise(0))

我收到此消息

  

不支持的文字类型类scala.collection.immutable。$冒号$冒号列表(红色)

我可以explode选择df1 {{1}}上的colorList,但这会让我的表太复杂。

1 个答案:

答案 0 :(得分:3)

您要查找的是array_contains函数,而不是Column.contains(后者仅适用于StringType列并检查字符串值是否包含子字符串):

df1.withColumn("isRed", when(array_contains($"colorList", "Red"),1).otherwise(0))