spark生产代码的rdd v.s.数据集

uoifb46i  于 2021-05-16  发布在  Spark
关注(0)|答案(2)|浏览(568)

是否有任何行业指南,以书面形式与任何一个 RDD 或者 Dataset 为了星火计划?
到目前为止我很清楚的是: RDD ,更多的类型安全,更少的优化(在sparksql的意义上) Dataset ,更少的类型安全,更多的优化
生产代码中推荐哪一种?似乎在stackoverflow中还没有这样的主题,因为spark在过去几年很流行。
我已经预见到社区的大多数人 Dataset :),因此,让我首先引用这个答案中的反对票(请分享反对意见):
就我个人而言,我发现静态类型的dataset是最不有用的:不要提供与dataset[row]相同的优化范围(尽管它们共享存储格式和一些执行计划优化—它不能完全受益于代码生成或堆外存储),也不要访问dataframe的所有分析功能。
没有RDD那么灵活,它只支持一小部分本机支持的类型。
当使用as方法转换数据集时,带有编码器的“类型安全”是有争议的。因为数据形状没有使用签名进行编码,所以编译器只能验证编码器的存在。

puruo6ea

puruo6ea1#

以下摘自《星火:终极指南》,回答这个问题:
何时使用低级api?
通常应在以下三种情况下使用较低级别的API:
您需要一些在高级api中找不到的功能;例如,如果您需要对集群中的物理数据放置进行非常严格的控制。
您需要维护一些使用rdd编写的遗留代码库。
你需要做一些自定义的共享变量操作
https://www.oreilly.com/library/view/spark-the-definitive/9781491912201/ch12.html
换句话说:如果您没有遇到上述情况,通常最好使用更高级的api(数据集/Dataframe)

8ehkhllq

8ehkhllq2#

rdd限制:
没有用于输入的优化引擎:
rdd中没有关于自动优化的规定。它不能使用像catalyst optimizer和tungsten execution engine这样的spark advance优化器。我们可以手动优化每个rdd。
在dataset和dataframe中都克服了这一局限性,利用catalyst生成优化的逻辑和物理查询计划。我们可以将相同的代码优化器用于python、java、scala或pythonDataframe/数据集api。它提供空间和速度效率。
二。运行时类型安全rdd中没有静态类型和运行时类型安全。它不允许我们在运行时检查错误。dataset为构建复杂的数据工作流提供了编译时类型安全性。编译时类型安全意味着,如果您试图将任何其他类型的元素添加到此列表中,它将给您带来编译时错误。它有助于在编译时检测错误,并使您的代码安全。
iii.内存不足时降级当没有足够的内存将rdd存储在内存或磁盘上时,rdd将降级。当存储rdd的内存不足时,就会出现存储问题。从ram溢出的分区可以存储在磁盘上,并提供相同的性能级别。通过增加ram和磁盘的大小,可以克服这个问题。
iv.序列化和垃圾收集的性能限制和开销由于rdd是内存中的jvm对象,它涉及垃圾收集和java序列化的开销这在数据增长时是昂贵的。因为垃圾收集的成本与java对象的数量成正比。使用对象较少的数据结构将降低成本。或者我们可以以序列化的形式持久化对象。
五。处理结构化数据rdd不提供数据的模式视图。它没有处理结构化数据的规定。
dataset和dataframe提供了数据的模式视图。它是一个分布式的数据集合,组织成命名的列。
这都是apachespark中rdd的局限性,因此引入了dataframe和dataset。
何时使用sparkDataframe/数据集api,何时使用普通rdd?

相关问题