首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >只有在in位于白名单中时,才能将火花数据行加载到内存中。

只有在in位于白名单中时,才能将火花数据行加载到内存中。
EN

Stack Overflow用户
提问于 2022-11-19 01:23:47
回答 1查看 35关注 0票数 0

我有一个火花处理过程,它处理每个作业大约100万个信号,并将这些行与一个巨大的表(50亿行)连接起来。内存中的整个表大约是500 is,所以我想知道是否可以只将相关的行加载到内存中,即

代码语言:javascript
运行
复制
val fileIds = incomingSignals("fileIds").dropDuplicates()
val df = spark.read.parquet(fileLocation).where(fileIds.contains(col("fileId")))

所以我的问题是:

  1. 是可行的吗?在filter子句(fileIds.count >1000000)中可能有一百万行,
  2. 在实际将不相关的行加载到内存之前能过滤读取吗?(我假设.where函数先加载到内存中,然后再装入过滤器)
  3. 甚至可以处理拼花文件吗?我想,在对它们进行任何处理/过滤之前,必须将它们加载到内存中。
EN

回答 1

Stack Overflow用户

发布于 2022-11-20 07:20:23

在filter子句中包含超过100万行的

  1. 筛选应该是可行的,但不是最优的。根据我的理解,这里的巨型表似乎在多个流输入中被重用。最佳的方法是在内存中持久化该表&通过"fileId“列对其进行分区。这将导致在加入时只对传入的信号数据进行洗牌(这比另一个表要小得多)。对于where子句,
  2. 将读取内存中的每条记录,应用筛选器,然后决定是否删除它。这意味着在读取文件时,单个记录将被加载到内存中,但所有记录将永远不会在内存中(除非您的过滤器没有删除任何内容)。您可以使用explain命令查看查询创建的详细物理计划。
  3. (如果包含过滤器与准确的列内容匹配,如这里所示)应该能够在内存中对序列化的记录内容本身进行筛选。如果您正在执行字符串equalsIgnoreCase或任何其他此类操作,则需要在内存中加载记录,反序列化为string &然后执行操作.

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74496897

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档