从 DataFrame 中按分区收集集合

Posted

技术标签:

【中文标题】从 DataFrame 中按分区收集集合【英文标题】:Collect collections by partitions from DataFrame 【发布时间】:2022-01-16 15:00:40 【问题描述】:

我有按列分区的 DataFrame:

val dfDL = spark.read.option("delimiter", ",")
                     .option("header", true)
                     .csv(file.getPath.toUri.getPath)
                     .repartition(col("column_to"))

val structure =  "schema_from" ::
                 "table_from"  ::
                 "column_from" ::
                 "link_type"   ::
                 "schema_to"   ::
                 "table_to"    ::
                 "column_to"   :: Nil

如何按分区获取数组集合? 也就是说,对于每个分区,我都需要一个集合。 比如我需要这个方法:

def getArrays(df: DataFrame): Iterator[Array] =  //Or Iterator[List]
   ???

分区的所有值:

val allTargetCol = df.select(col("column_to")).distinct().collect().map(_.getString(0))

【问题讨论】:

【参考方案1】:

如果你知道分区值,你可以遍历每个分区值,调用过滤器然后收集。

伪代码

partitions = []

for partition_value in partition_values_list:
  partitions.append(df.filter(f.col('partiton_column') == partition_value).collect())

否则,您需要先制作不同分区值的列表/数组,然后重复上述步骤。

【讨论】:

是的,我知道分区值。 allTargetCol. 然后像上面给出的伪代码那样简单地迭代它(更新了答案)。 这是个好主意?。谢谢!但我只需要使用来自 Scala 的不可变集合) 我理解你的想法。我试试看 .collect() 之后应该有转换成不可变集合的选项。

以上是关于从 DataFrame 中按分区收集集合的主要内容,如果未能解决你的问题,请参考以下文章

在 Spark Dataframe 中实现 Window 的重叠分区

从分区拼花文件中读取 DataFrame

如何在不收集的情况下将 RDD、Dataframe 或 Dataset 直接转换为广播变量?

从 DataFrame 中收集两个值,并将它们用作案例类的参数;寻找不那么冗长的解决方案

在 pandas MultiIndex DataFrame 中按级别求和列

Spark Sql:从时间戳按小时间隔分区