在对数据的特定列进行聚合操作之前,我试图对数据进行预分区。我有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)
我已经看过
我仍然无法弄清楚。
答案 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与执行程序分区的数量进行映射时起作用。 希望这会有所帮助