此代码
def foobar(df):
return (
df.withColumn("id", monotonically_increasing_id())
.withColumn("foo", lit("bar"))
.withColumn("bar", lit("foo"))
)
somedf = foobar(somedf)
somedf.show() # <-- each `id` has value 0
创建并打印其中每个ID具有值0的 Dataframe 。
我真的很困惑,因为这是documentation中的monotonically_increasing_id
方法描述:
生成的ID保证是单调递增且唯一的,但不是连续的,目前的实现将分区ID放在高31位,将每个分区内的记录数放在低33位,假设 Dataframe 的分区不超过10亿个,每个分区的记录数不超过80亿条。
它清楚地说明了每一行都将有一个唯一的值,并且它还指出每个id在每个分区中都是唯一的,这意味着在分布式环境中使用这种方法是安全的,因为每一行在所有节点上都将有一个唯一的id。
它将分区ID放在高31位,将每个分区内的记录号放在低33位
更令人困惑的是,在单示例环境(在我的本地机器上)上,上面的代码可以完美地工作(每一行都有唯一的id),但是当我将相同的代码部署到AWS并在EMR上运行它时,id下只有0
1条答案
按热度按时间z0qdvdin1#
万一有人也有
montonically_increasing_id
返回0的问题(问题比我预期的要愚蠢得多)确保您没有强制转换为
int32
,因为montonically_increasing_id
返回int64
,并且溢出似乎被强制转换为0