我使用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列的风险在每次提取结束时?
答案 0 :(得分:0)
您不需要处理太多代码,因此给出更精确的答案有点困难,但是您可以尝试[monotonically_increasing_id()][1]
。
摘要形成其Javadoc:
[添加]生成单调递增的64位整数的列表达式。保证生成的ID单调递增且唯一,但不连续。当前实现将分区ID放在高31位中,将记录号放在每个低33位中。假设数据帧的分区少于10亿,每个分区的记录少于80亿。