当前位置: 首页 > 知识库问答 >
问题:

spark中的预分区数据,这样每个分区在我们正在分区的列中都有不重叠的值

柯星辰
2023-03-14

我试图在对数据的某一列执行聚合操作之前对数据进行预分区。我有3个工作节点,我希望每个分区在我分区的列中都有不重叠的值。我不希望出现两个分区在列中可能具有相同值的情况。

例如。如果我有以下数据

ss_item_sk | ss_quantity
1          | 10.0
1          |  4.0
2          |  3.0
3          |  5.0
4          |  8.0
5          |  13.0
5          |  10.0

那么以下隔墙是令人满意的:

分区1

ss_item_sk | ss_quantity
1          | 10.0
1          |  4.0

分区2

ss_item_sk | ss_quantity
2          |  3.0
3          |  5.0

分区3

ss_item_sk | ss_quantity
4          |  8.0
5          |  13.0
5          |  10.0

不幸的是,我下面的代码不起作用。

spark.sqlContext.setConf( "spark.sql.shuffle.partitions", "3")
var json = spark.read.json("hdfs://master:9000/tpcds/store_sales")
var filtered = json.filter(row => row.getAs[Long]("ss_item_sk") < 180)
filtered.repartition($"ss_item_sk").write.json(savepath)

我已经看过了

  • 如何定义数据帧的分区

我还是想不通。

共有1个答案

茹展鹏
2023-03-14

按键重新分区根据数据帧级别的键进行数据分布。而在hdfs上编写数据帧是一件独立的事情

df.coalesce(1).write.partitionBy("ss_item_sk").json(savepath)

在这个场景中,您也将看到分区列创建的不同目录中的多个零件文件。只能根据“partitionBy”方法控制将运行的写入程序/还原程序的数量。它与Map Reduce Partitioner非常相似,因为它控制着要运行的reducer的数量。要基于分区列获取单个文件,必须运行以下命令。

df.repartition($"ss_item_sk").write.partitionBy("ss_item_sk").json(savepath)

现在,当减速器被映射到执行器分区的数量时,这就起作用了。希望这能有所帮助

 类似资料:
  • 我需要从一个Hive表中读取数据并将其插入到另一个Hive表中。两个表的架构是相同的。该表按日期分区 步骤1:从Spark的源表中读取数据。 第 2 步:按列(国家、日期)和分区数重新分区为 4。 我只得到每个国家代码1个分区

  • 我需要spark(scala)数据帧分区方面的帮助。我需要按一个键列划分成n个分区,与同一个键相关的所有行都应该在同一个分区中(即,键不应该分布在整个分区中) 注意:我的钥匙可能有几百万 例如:假设我有下面的数据框 等等等等 正如您所看到的,许多值共享相同的键。我想将此数据集划分为"n"个分区,其中相同的键应该在相同的分区中,并且键不应该分布在分区之间。多个键驾驶室位于同一分区,键不可排序。 提前

  • 我试图优化两个spark dataframes之间的联接查询,让我们将它们称为df1、df2(在公共列“saleid”上联接)。df1非常小(5M),所以我在spark集群的节点中广播它。df2非常大(200米行),所以我尝试通过“saleid”对它进行桶/重新分区。 例如: 分区: 水桶: 我不知道哪一个是正确的技术使用。谢谢。

  • 整数n的划分是将n写成正整数和的一种方式。对于 例如,对于n=7,一个分区是1 1 5。我需要一个程序来查找所有 使用“r”整数对整数“n”进行分区。例如,

  • 根据Spark 1.6.3的文档,应该保留结果数据表中的分区数: 返回由给定分区表达式分区的新DataFrame,保留现有的分区数 Edit:这个问题并不涉及在Apache Spark中删除空DataFrame分区的问题(例如,如何在不产生空分区的情况下沿列重新分区),而是为什么文档所说的内容与我在示例中观察到的内容不同

  • 我有一个具有如下模式的dataframe: