【问题标题】:How to make Spark read only specified rows?如何让 Spark 只读取指定的行?
【发布时间】:2018-04-05 03:47:36
【问题描述】:

假设我从一个大表A 中选择给定的行。目标行由小索引表B 或列表C 给出。

的默认行为
A.join(broadcast(B), 'id').collect()

A.where(col('id').isin(C)).collect()

将创建一个任务,在过滤出目标行之前读取A所有数据。以广播连接为例,在任务 DAG 中,我们看到Scan parquet 过程确定了要读取的列,在这种情况下,这些列都是列。

问题是,由于A的每一行都很大,而且选择的行也很少,理想情况下最好:

  1. 只读入Aid列;
  2. 决定使用广播连接输出的行;
  3. 根据步骤 2 仅读取 选定 行以从 A 输出。

有可能实现吗?

顺便说一句,要输出的行可能分散在 A 中,因此无法使用分区键。

【问题讨论】:

    标签: python apache-spark join pyspark


    【解决方案1】:

    将创建一个读取A的所有数据的任务

    你错了。虽然第一种情况不会推送任何过滤器,除了join 键上的IsNotNull 以防内连接或左连接,第二种方法会将In 向下推送到源。

    如果isin 列表很大,这可能没有必要更快,但它仍然经过优化。

    如果您想从可能的优化中充分受益,您仍应使用分桶 (DISTRIBUTE BY) 或分区 (PARTITIONING BY)。这些在IS IN 场景中很有用,但也可以使用分桶,在第一个场景中,B 太大而无法广播。

    【讨论】:

    • 我可以在“扫描镶木地板”过程中看到推送的过滤器([IsNotNull(id), EqualTo(id, xxxxxx)]),但是当我在大型镶木地板上对其进行测试时,Spark 似乎仍然读入所有数据。我想知道为什么...
    • 我做了更多的实验,似乎这个下推过滤器只对某些数据类型有效。但是,在我的情况下,不包括字符串类型的 id。
    猜你喜欢
    • 1970-01-01
    • 2022-12-03
    • 1970-01-01
    • 2014-11-13
    • 2021-06-30
    • 2016-03-26
    • 1970-01-01
    • 2011-07-26
    • 2014-10-19
    相关资源
    最近更新 更多