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

时间:2019-01-06 09:21:45

标签: scala apache-spark

在对数据的特定列进行聚合操作之前,我试图对数据进行预分区。我有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 个答案:

答案 0 :(得分:0)

按键分区可以在数据帧级别基于键进行数据分配。在hdfs上写数据帧是另一回事。您可以尝试

Access to XMLHttpRequest at '***URL***' from origin 'http://localhost:3000' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.

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

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

现在,这在将reducer与执行程序分区的数量进行映射时起作用。 希望这会有所帮助