【问题标题】:Spark DataFrame Repartition and Parquet PartitionSpark DataFrame 重新分区和 Parquet 分区
【发布时间】:2019-03-02 10:17:30
【问题描述】:
  1. 我在列上使用重新分区来将数据存储在 parquet 中。但 我看到没有。 parquet 分区文件的数量与 不。 Rdd 分区。 rdd分区之间是否没有相关性 和镶木地板?

  2. 当我将数据写入 parquet 分区并使用 Rdd 重新分区,然后我从镶木地板分区中读取数据,是 rdd分区号相同的情况 在读/写期间?

  3. 如何使用列 ID 对数据帧进行分桶并重新分区 同一个column id不同的dataframe?

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

【问题讨论】:

    标签: apache-spark parquet


    【解决方案1】:

    您在此处询问的几件事 - 数据的分区、存储桶和平衡,

    分区:

    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) 我在列上使用重新分区来将数据存储在镶木地板中。但我认为没有。 parquet 分区文件的数量与编号不同。 Rdd 分区。 rdd分区和parquet分区没有关联吗?

    • repartition 与 bucketBy 相关,而不是 partitionedBy。分区文件由 spark.sql.shuffle.partitionsspark.default.parallelism 等其他配置管理

    2) 当我将数据写入 parquet 分区并使用 Rdd 重新分区然后我从 parquet 分区读取数据时,在读/写期间,rdd 分区号是否相同? em>

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

    3) 使用列 ID 对数据帧进行分桶和通过相同的列 ID 重新分区数据帧有何不同?

    • 工作原理类似,只是分桶是一种写入操作,用于持久化。

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

    • 两个数据集的repartition 都在内存中,如果其中一个或两个数据集都被持久化,那么还要查看bucketBy

    【讨论】:

    • 当我写出数据帧时是否可以重新分区?像这样:succeed.select("year", "month", "day", "hour", "fileUrl", "file") .repartition($"hour") .write .format("json") .option("multiline", "true") .option("compression","gzip") .partitionBy("year", "month", "day", "hour") .mode("append") .save("<path>") 或者我应该创建一个新的df,然后将其写出来?
    • @Eva 你可以在 Spark DF 上链接多个操作(转换),所以你真的不需要创建一个新的 DF
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-17
    • 2016-03-06
    • 1970-01-01
    • 2019-08-26
    • 1970-01-01
    • 2017-12-02
    相关资源
    最近更新 更多