首页 文章

Spark DataFrame重新分区和Parquet分区

提问于
浏览
0
  • 我在列上使用重新分区将数据存储在镶木地板中 . 但我看到了没有 . 镶木地板分区文件与no不同 . Rdd分区 . rdd分区和镶木地板分区之间没有相关性吗?

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

  • 如何使用列ID对数据帧进行分支,并通过相同的列ID对数据帧进行重新分区?

  • 在考虑Spark中连接的性能时,我们应该考虑分组或重新分区(或者两者兼而有之)

1 回答

  • 0

    你要问的几件事 - 分区,分区和数据 balancer ,

    Partitioning:

    • 分区数据通常用于水平分配负载,这具有性能优势,并有助于以逻辑方式组织数据 .

    • 分区表会更改持久化数据的结构,现在将创建反映此分区结构的子目录 .

    • 这可以显着提高查询性能,但前提是分区方案反映了常见的过滤 .

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

    Bucketing:

    • Bucketing是另一种将数据集分解为更易于管理的部分的技术 . 根据提供的列,将整个数据散列到用户定义数量的存储区(文件)中 .

    • Hive的同义词 Distribute By

    在Spark中,这由 df.write.bucketBy(n, column*) 完成,并通过将 columns 分区到同一文件中来分组数据 . 生成的文件数由 n 控制

    Repartition:

    • 它根据给定的分区表达式将一个新的 DataFrame 均衡地返回到给定数量的内部文件中 . 生成的DataFrame是散列分区的 .

    • Spark管理这些分区上的数据,这些数据有助于并行化分布式数据处理,只需最少的网络流量即可在 Actuator 之间发送数据 .

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

    Tl;dr

    1)我在列上使用重新分区将数据存储在镶木地板中 . 但我看到了没有 . 镶木地板分区文件与no不同 . Rdd分区 . rdd分区和镶木地板分区之间没有相关性吗?

    • 重新分区与bucketBy没有partitionedBy的相关性 . 分区文件由 spark.sql.shuffle.partitionsspark.default.parallelism 等其他配置管理

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

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

    3)如何使用列id对数据帧进行分支,并通过相同的列ID重新分区数据帧?

    • 类似工作,除了bucketing是一个写操作,用于持久化 .

    4)在考虑Spark中的连接性能时,我们应该关注分组或重新分区(或者两者兼而有之)

    两个数据集的

    • repartition 都在内存中,如果一个或两个数据集都是持久的,那么也请查看 bucketBy .

相关问题