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