在Spark上生成确定性ID列

问题描述 投票:1回答:1

我使用Spark窗口函数row_number()为具有嵌套结构的复杂DataFrame生成ID。然后,我提取部分DataFrame以创建多个表作为输出,其中包括此键。

但是,一旦触发操作,Spark仅实现表,因此当提取的表保存在HDFS中时,它将最终生成ID。另一方面,当处理大型DataFrame和转换时,Spark可能会对数据进行混洗,从而更改row_number()将生成的可能值。

由于我从单个DataFrame生成多个表,我需要ID列在整个表中保持一致,这意味着它需要在提取表之前生成一次,而不是为每个输出动态生成。

这个的起源逻辑来自Would a forced Spark DataFrame materialization work as a checkpoint?,它更详细地解释了根本问题。

但在这里我的问题是:我如何只创建一次这样的ID列并将其存储为固定值,然后使用它从DataFrame中提取各种表,而不会冒最后由谱系生成ID列的风险每次提取?

apache-spark apache-spark-sql spark-dataframe row-number
1个回答
0
投票

你没有太多代码可以使用,所以给出一个更精确的答案有点困难,但你可以试试[monotonically_increasing_id()][1]

它的Javadoc抽象形式:

[添加]一个列表达式,它生成单调递增的64位整数。生成的ID保证单调增加且唯一,但不是连续的。当前实现将分区ID置于高31位,并将每个分区内的记录号置于低33位。假设数据框的分区少于10亿,每个分区的记录少于80亿。

© www.soinside.com 2019 - 2024. All rights reserved.