gpt4 book ai didi

apache-spark - 数据框到数据集,类型为 Any

转载 作者:行者123 更新时间:2023-12-01 00:35:34 25 4
gpt4 key购买 nike

我最近从 Spark 1.6 迁移到 Spark 2.X,并且我想尽可能地从 Dataframes 迁移到 Datasets。我试过这样的代码

case class MyClass(a : Any, ...)

val df = ...
df.map(x => MyClass(x.get(0), ...))

如您所见 MyClass有一个类型为 Any 的字段,因为我在编译时不知道我用 x.get(0) 检索的字段的类型.它可能是 long、string、int 等。

但是,当我尝试执行类似于您在上面看到的代码时,我得到一个异常:
java.lang.ClassNotFoundException: scala.Any

通过一些调试,我意识到引发了异常,而不是因为我的数据类型为 Any , 但因为 MyClass有一个类型 Any .那么我该如何使用数据集呢?

最佳答案

除非你对 limited and ugly workarounds 感兴趣喜欢 Encoders.kryo :

import org.apache.spark.sql.Encoders

case class FooBar(foo: Int, bar: Any)

spark.createDataset(
sc.parallelize(Seq(FooBar(1, "a")))
)(Encoders.kryo[FooBar])

或者

spark.createDataset(
sc.parallelize(Seq(FooBar(1, "a"))).map(x => (x.foo, x.bar))
)(Encoders.tuple(Encoders.scalaInt, Encoders.kryo[Any]))

你没有。 Dataset 中的所有字段/列必须是已知的同类类型,其中存在隐式 Encoder范围内。 Any 根本没有位置那里。

UDT API 提供了更多的灵 active 并允许有限的多态性,但它是私有(private)的,与 Dataset 不完全兼容API 并带有显着的性能和存储损失。

如果对于给定的执行所有相同类型的值,您当然可以创建专门的类并决定在运行时使用哪一个。

关于apache-spark - 数据框到数据集,类型为 Any,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41504976/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com