在 Spark 中对巨大数据帧进行高效过滤

Posted

技术标签:

【中文标题】在 Spark 中对巨大数据帧进行高效过滤【英文标题】:Efficient Filtering on a huge data frame in Spark 【发布时间】:2017-03-02 11:07:45 【问题描述】:

我有一个包含 5 亿行的 Cassandra 表。我想使用 spark 根据作为 Cassandra 中的分区键的字段进行过滤。

您能否建议基于列表键在 Spark/Spark SQL 中进行过滤的最佳可能/有效方法,该列表键也非常大。

基本上我只需要 Cassandra 表中存在于键列表中的那些行。

我们正在使用 DSE 及其功能。 我使用的方法大约需要一个小时左右。

【问题讨论】:

你说的大列表到底是什么意思? 我想加入 2 个数据集。 Cassandra 表有 500+ 百万条记录和一个键列表(即 object_id)。最终结果应该只有那些在列表中 object_id 匹配的 Cassandra 表行。我正在使用需要大量时间的连接,我想防止这种情况发生 【参考方案1】:

您检查过repartitionByCassandraReplicajoinWithCassandraTable 吗?

https://github.com/datastax/spark-cassandra-connector/blob/75719dfe0e175b3e0bb1c06127ad4e6930c73ece/doc/2_loading.md#performing-efficient-joins-with-cassandra-tables-since-12

joinWithCassandraTable 利用 java 驱动器执行单个 查询源 RDD 所需的每个分区,因此不需要 数据将被请求或序列化。这意味着任何之间的连接 RDD 和 Cassandra Table 可以在不做完整表的情况下执行 扫描。在共享相同内容的两个 Cassandra 表之间执行时 分区键,这将不需要在机器之间移动数据。 在所有情况下,此方法都将使用源 RDD 的分区和 数据位置的放置。

方法repartitionByCassandraReplica可以用来重定位数据 在 RDD 中匹配给定表的复制策略和 键空间。该方法将在 给定 RDD,然后使用这些值来确定 集群将负责该数据。

【讨论】:

以上是关于在 Spark 中对巨大数据帧进行高效过滤的主要内容,如果未能解决你的问题,请参考以下文章

Spark:在scala中的数据帧上使用动态过滤器进行聚合

需要使用迭代多个列的过滤器值过滤 Spark 数据帧

当我们尝试将巨大的 Pandas 数据帧(40-50 百万行)转换为 Spark 2.0 数据帧时如何提高性能

在 Spark 中高效地连接一个大表(1TB)和另一个小表(250GB)

使用 .NET for Spark 在数据帧中高效地填充数据

为啥 sortBy() 不能在 Spark 中对数据进行均匀排序?