SparkDatawithwithColumn添加分区ID

时间:2019-06-04 21:25:38

标签: scala apache-spark dataset hadoop-partitioning

我正在尝试编写一个辅助函数,该函数接受任何类型的数据集Dataset[_],并返回一个新列“ partitionId”,这是单个数据单元所属分区的ID。

例如,如果我下面有一个数据集,默认情况下它有两个分区。

+-----+------+
| colA|  colB|
+-----+------+
|   1 |     a|
|   2 |     b|
|   3 |     c|
+-----+------+

函数之后,应该是下面的结果,其中前两个数据单元属于同一分区,第三个数据单元属于另一个分区。

+-----+------+------------+
| colA|  colB| partitionId|
+-----+------+------------+
|   1 |     a|           1|
|   2 |     b|           1|
|   3 |     c|           2|
+-----+------+------------+

我尝试了withColumn()和mapPartitions(),但是它们都不适合我。 对于withColumn(),我无法获得数据单元所属分区的信息,例如withColumn("partitionId", {What should be here to add the partitionId?}) 对于mapPartitions(),我尝试过:

dataset
  .mapPartitions(iter => {
    val partitionId = UUID.randomUUID().toString
    iter.map(dataUnit => MyDataType.addPartitionId(partitionId))
  })

但这仅适用于Dataset[MyDataType]之类的特定类型,不适用于Dataset[_]

如何为任何数据集添加partitionId列?

1 个答案:

答案 0 :(得分:2)

您是否有理由需要每个记录的分区ID?无论哪种方式,您都可以通过以下方式实现:

import org.apache.spark.sql.functions.spark_partition_id
...
dataFrame.withColumn("partitionID", spark_partition_id)