PySpark 'monotonically_increasing_id()'对每一行返回0

vwhgwdsa  于 2023-01-13  发布在  Apache
关注(0)|答案(1)|浏览(105)

此代码

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

z0qdvdin

z0qdvdin1#

万一有人也有montonically_increasing_id返回0的问题(问题比我预期的要愚蠢得多)
确保您没有强制转换为int32,因为montonically_increasing_id返回int64,并且溢出似乎被强制转换为0

相关问题