在pysp中用整数对列进行编码

2024-04-26 09:55:30 发布

您现在位置:Python中文网/ 问答频道 /正文

我必须在pyspark(spark2.0)的大数据帧中对列进行编码。所有的值几乎都是唯一的(大约1000mln值)。 最好的选择可能是StringIndexer,但由于某些原因,它总是失败并终止我的spark会话。 我能不能写一个这样的函数:

id_dict() = dict()
def indexer(x):
    id_dict.setdefault(x, len(id_dict))
    return id_dict[x]

并将其映射到id为_dict saving the items()的DataFrame?这句话会在每个遗嘱执行人身上同步吗? 我需要所有这些来预处理元组('x',3,5)的火花.mllibALS模型。 谢谢您。在


Tags: 数据函数id编码lenreturndef原因
1条回答
网友
1楼 · 发布于 2024-04-26 09:55:30

StringIndexer将所有标签保存在内存中,因此,如果值几乎是唯一的,则不会缩放。在

您可以获取唯一值、排序和添加id,这很昂贵,但在这种情况下更可靠:

from pyspark.sql.functions import monotonically_increasing_id

df = spark.createDataFrame(["a", "b", "c", "a", "d"], "string").toDF("value")

indexer = (df.select("value").distinct()
  .orderBy("value")
  .withColumn("label", monotonically_increasing_id()))

df.join(indexer, ["value"]).show()
# +  -+     -+
# |value|      label|
# +  -+     -+
# |    d|25769803776|
# |    c|17179869184|
# |    b| 8589934592|
# |    a|          0|
# |    a|          0|
# +  -+     -+

请注意,标签不是连续的,可能会因运行而不同,或者在spark.sql.shuffle.partitions发生变化时发生变化。如果不可接受,则必须使用RDDs

^{pr2}$

相关问题 更多 >