Spark DataFrame分区和镶木地板分区

时间:2018-09-26 15:14:21

标签: apache-spark parquet

  1. 我正在对列使用分区,以将数据存储在拼花中。但 我看到没有。实木复合地板分区文件的数量与 没有。 Rdd分区。 rdd分区之间没有相关性 和实木复合地板隔板?

  2. 当我将数据写入木地板分区并且使用Rdd时 重新分区,然后我从实木复合地板分区读取数据,是 rdd分区号相同时有任何条件 在读/写期间?

  3. 如何使用列ID对数据框进行存储并重新分区 数据框是否通过相同的列ID不同?

  4. 在考虑Spark中联接的性能时,我们应该 在查看存储分区或重新分区(或可能同时分区)

1 个答案:

答案 0 :(得分:6)

您正在询问的事物的结合-数据的分区,存储和平衡

分区:

  1. 分区数据通常用于水平分布负载,这具有性能优势,并有助于以逻辑方式组织数据。
  2. 分区表更改了持久化数据的结构,现在将创建反映此分区结构的子目录。
  3. 这可以大大提高查询性能,但前提是分区方案能够反映出常见的过滤条件。

在Spark中,此操作由df.write.partitionedBy(column*)完成,并通过将columns分区到同一子目录中来对数据进行分组。

装箱:

  1. 装桶是另一种将数据集分解为易于管理的部分的技术。根据提供的列,将整个数据散列到用户定义数量的存储桶(文件)中。
  2. 与Hive的Distribute By同义词

在Spark中,此操作由df.write.bucketBy(n, column*)完成,并通过将columns分区到同一文件中来对数据进行分组。生成的文件数由n

控制

分区:

  1. 它根据给定的分区表达式将给定数量的内部文件平均返回一个新的DataFrame平衡。所得的DataFrame被哈希分区。
  2. Spark可管理这些分区上的数据,从而有助于以最小的网络流量并行化分布式数据处理,以便在执行程序之间发送数据。

在Spark中,此操作由df.repartition(n, column*)完成,并通过将columns分区到同一内部分区文件中来对数据进行分组。请注意,没有数据可持久存储,这只是基于类似于bucketBy

的约束的内部数据平衡

Tl; dr

1)我正在对列使用分区,以将数据存储在拼花中。但我看到没有。实木复合地板分区文件的编号与否不同。 Rdd分区。 rdd分区和实木复合地板分区之间没有关联吗?

  • 分区与bucketBy相关,而不与partitionedBy相关。分区文件由spark.sql.shuffle.partitionsspark.default.parallelism
  • 之类的其他配置控制。

2)当我将数据写入镶木地板分区并使用Rdd重新分区,然后从镶木地板分区读取数据时,在读/写期间rdd分区号相同时是否存在任何条件吗? em>

  • 在读取期间,分区数将等于spark.default.parallelism

3)使用列ID存储数据帧和通过相同的列ID重新划分数据帧有何不同?

  • 工作方式类似,不同之处在于,存储区是一种写操作,用于持久化。

4)在考虑Spark中联接的性能时,我们应该着眼于存储分区或重新分区(或者可能是两者)

  • 两个数据集的repartition都在内存中,如果其中一个或两个数据集都保留了,则还要查看bucketBy