我有一个Spark 2.0.0数据集,其中有一列Foo
对象,例如val ds: Dataset[(int, Foo, int)]
。Bar
是Foo
的萃取剂。我希望能够添加使用匹配语句(或任何任意复杂的语句)构造的列。像这样:ds.withColumn("extracted", $"_2" match { case Bar(x) => x })
。在Spark中实现这种行为的最佳方式是什么?
更新:
@T。Gawęda和@zero323 -感谢你们的周到评论。我认为我的答案在于这句话:"这是不可能的模式匹配超过Column
提取数据。"我确实使用了Dataset[Row]
,但我过度简化了Dataset[(int, Foo, int)]
。我倾向于使用withColumn
而不是map
的原因是因为(1)我试图避免引用任何其他列(它们没有进入匹配case函数)和(2)我想通过名称引用Foo/Bar列(因为Row
中列的位置未知)。
如果您有静态类型的Dataset
,并且您想执行任意复杂的操作,为什么不直接使用map
:
ds.map { case (first, Bar(x), last) => ??? }
withColumn
被设计为在DataFrames
/Datasets[Row]
上操作,不可能在Column
上进行模式匹配来提取数据。
Column
更像是一个将应用于特定数据集的函数。
您也可以使用map
,就像在RDD:
val dsWithExtracted = ds.map {
case (x, Bar(y), z) => (x, y, z)
}
编辑:withColumn将不工作,将返回正确的类型,但将在运行时失败