将火柴盒应用于火花柱



我有一个Spark 2.0.0数据集,其中有一列Foo对象,例如val ds: Dataset[(int, Foo, int)]BarFoo的萃取剂。我希望能够添加使用匹配语句(或任何任意复杂的语句)构造的列。像这样: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将不工作,将返回正确的类型,但将在运行时失败

相关内容

  • 没有找到相关文章

最新更新