i使用火花窗口函数 row_number()
为带有嵌套结构的复杂数据框架生成ID。之后,我提取数据框的一部分以创建多个表作为输出,其中包括此密钥。
但是,一旦触发操作,Spark才能实现该表,因此当提取的表被保存在HDF中时,它将在最后生成ID。另一方面,在处理大型数据框架和转换时,Spark可能会将数据调整并因此更改row_number()
会生成的可能值。
由于我从单个数据帧中生成多个表,因此我需要ID列在整个表中保持一致,这意味着在提取表之前需要生成一次,而不是针对每个输出进行动态。
。此的原始逻辑是从强制的Spark DataFrame物质化作为检查点的作用吗?这更详细地解释了根部问题。
但这里我的问题是:如何仅创建这样的ID列一次并将其存储为固定值,然后将其用于从数据框架中提取各种表,而不会冒着谱系生成的ID列的风险在每个提取的结尾?
您没有太多的代码可以使用,因此很难给出更精确的答案,但是您可以尝试[monotonically_increasing_id()][1]
。
抽象形成其javadoc:
[添加]一个列表达式,该列表达式产生单调增加64位整数。生成的ID可以单调地增加和独特,但不是连续的。当前的实现将分区ID放置在上部31位,并在下部33位中的每个分区中的记录编号。假设数据框架的分区少于10亿,并且每个分区的记录少于80亿。