将匹配大小写应用于Spark列?

时间:2016-09-30 18:15:52

标签: scala apache-spark apache-spark-sql

我有一个Spark 2.0.0数据集,其中包含一列Foo个对象,例如val ds: Dataset[(int, Foo, int)]BarFoo的提取程序。我希望能够添加一个使用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中列的位置未知)。

2 个答案:

答案 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将无效,将返回正确的类型,但在运行时将失败