PySpark udf 中的 Numpy randint 返回意外值
Numpy randint within PySpark udf returning unexpected values
我创建了一个 udf 来在 PySpark 数据帧的列中生成随机的十位整数:
phone_udf = F.udf(lambda: np.random.randint(low = 1111111111, high = 9999999999), T.IntegerType())
households = sc.union([sc.parallelize([[j]
for j
in np.random.choice(household_sizes, size=partition_size, p=hh_size_probs).tolist()])
for i in range(partition_count)]).toDF(["_household_members"])\
.limit(nhouseholds)\
.withColumn("household_id", F.row_number().over(w))\
.withColumn("_hoh_last_name_id", (F.rand() * name_count).cast("int"))\
.withColumn("_hh_address_id", (F.rand() * address_filtered_count).cast("int"))\
.withColumn("phone", phone_udf())
但是,生成的数据框的“phone”列包含所有不同长度的整数,最多 10 位数字,包括正数和负数。我不确定为什么 np.random.randint 在 udf 中没有按预期表现。
Spark 采用 32 位整数。由于正在生成的整数范围(1111111111、9999999999)包含太高而无法用 32 位表示的整数,因此 spark 错误地解释了 64 位整数。使用 spark 的 LongType() 或首先将整数转换为字符串都可以解决问题。
我创建了一个 udf 来在 PySpark 数据帧的列中生成随机的十位整数:
phone_udf = F.udf(lambda: np.random.randint(low = 1111111111, high = 9999999999), T.IntegerType())
households = sc.union([sc.parallelize([[j]
for j
in np.random.choice(household_sizes, size=partition_size, p=hh_size_probs).tolist()])
for i in range(partition_count)]).toDF(["_household_members"])\
.limit(nhouseholds)\
.withColumn("household_id", F.row_number().over(w))\
.withColumn("_hoh_last_name_id", (F.rand() * name_count).cast("int"))\
.withColumn("_hh_address_id", (F.rand() * address_filtered_count).cast("int"))\
.withColumn("phone", phone_udf())
但是,生成的数据框的“phone”列包含所有不同长度的整数,最多 10 位数字,包括正数和负数。我不确定为什么 np.random.randint 在 udf 中没有按预期表现。
Spark 采用 32 位整数。由于正在生成的整数范围(1111111111、9999999999)包含太高而无法用 32 位表示的整数,因此 spark 错误地解释了 64 位整数。使用 spark 的 LongType() 或首先将整数转换为字符串都可以解决问题。