Kryo通过有效的序列化方法帮助提高Spark应用程序的性能。
我想知道Kryo是否会在SparkSQL方面提供帮助,以及我应该如何使用它。
在SparkSQL应用程序中,我们将执行很多基于列的操作,例如df.select($"c1", $"c2")
,并且DataFrame Row的架构不是完全静态的。
不确定如何为用例注册一个或多个序列化程序类。
例如:
case class Info(name: String, address: String)
...
val df = spark.sparkContext.textFile(args(0))
.map(_.split(','))
.filter(_.length >= 2)
.map {e => Info(e(0), e(1))}
.toDF
df.select($"name") ... // followed by subsequent analysis
df.select($"address") ... // followed by subsequent analysis
我认为为每个
select
定义案例类不是一个好主意。或者如果我像
Info
一样注册registerKryoClasses(Array(classOf[Info]))
是否有帮助 最佳答案
根据Spark's documentation的说法,SparkSQL不使用Kryo或Java序列化。
它们比Java或Kryo轻巧得多,这比预期的(要序列化,要说的是3个long和两个int的行,这要容易得多),而不是类,版本说明和内部变量。 。)并必须实例化。
话虽这么说,但是有一种方法可以将Kryo用作编码器实现,请参见此处的示例:How to store custom objects in Dataset?。但这是作为在数据集中存储自定义对象(例如非产品类)的解决方案,而不是专门针对标准数据帧。
如果没有Java序列化程序的Kryo,则为自定义非产品类创建编码器会受到一定的限制(请参阅关于用户定义类型的讨论),例如,从此处开始:Does Apache spark 2.2 supports user-defined type (UDT)?
关于apache-spark - Keto在Spark SQL中有帮助吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49270880/