- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试在具有大约 15.000.000 个唯一字符串值的列上使用 Spark 的 StringIndexer 特征转换器。无论我投入多少资源,Spark 总是会因某种内存不足异常而死在我身上。
from pyspark.ml.feature import StringIndexer
data = spark.read.parquet("s3://example/data-raw").select("user", "count")
user_indexer = StringIndexer(inputCol="user", outputCol="user_idx")
indexer_model = user_indexer.fit(data) # This never finishes
indexer_model \
.transform(data) \
.write.parquet("s3://example/data-indexed")
#
# There is insufficient memory for the Java Runtime Environment to continue.
# Native memory allocation (mmap) failed to map 268435456 bytes for committing reserved memory.
# Possible reasons:
# The system is out of physical RAM or swap space
# In 32 bit mode, the process size limit was hit
# Possible solutions:
# Reduce memory load on the system
# Increase physical memory or swap space
# Check if swap backing store is full
# Use 64 bit Java on a 64 bit OS
# Decrease Java heap size (-Xmx/-Xms)
# Decrease number of Java threads
# Decrease Java thread stack sizes (-Xss)
# Set larger code cache with -XX:ReservedCodeCacheSize=
# This output file may be truncated or incomplete.
#
# Out of Memory Error (os_linux.cpp:2657)
c3.2xlarge
工作人员上进行。
from pyspark.sql.functions import row_number
from pyspark.sql.window import Window
data = spark.read.parquet("s3://example/data-raw").select("user", "count")
uid_map = data \
.select("user") \
.distinct() \
.select("user", row_number().over(Window.orderBy("user")).alias("user_idx"))
data.join(uid_map, "user", "inner").write.parquet("s3://example/data-indexed")
最佳答案
你得到 OOM 错误的原因是在幕后,Spark 的 StringIndexer
电话countByValue
在“用户”列上获取所有不同的值。
使用 15M 不同的值,您实际上是在驱动程序上创建一个巨大的 Map 并且它耗尽了内存......一个简单的解决方法是增加驱动程序的内存。如果你使用 spark-submit 你可以使用 --driver-memory 16g
.您也可以使用 spark.driver.memory
配置文件中的属性。
然而,随着不同值数量的增加,问题将再次发生。不幸的是,Spark 的转换器无能为力,这就是原因。实际上,在适应数据之后,转换器旨在被序列化以供进一步使用。因此,它们没有被设计成这么大(一个包含 15M 字符串的 map 至少会重 100MB)。我认为您需要重新考虑对这么多类别使用 StringIndexer。在这里使用哈希技巧可能更适合。
最后,让我评论一下您的解决方法。使用您的窗口,您实际上将所有 15M 类别放在一个分区上,因此放在一个执行程序上。如果这个数字增加,它就不会扩展。此外,使用非分区窗口通常是一个坏主意,因为它会阻止并行计算(除了将所有内容都放在同一个分区上会导致 OOM 错误)。我会计算你的 uid_map
像这样:
# if you don't need consecutive indices
uid_map = data\
.select("user")\
.distinct()\
.withColumn("user_idx", monotonically_increasing_id())
# if you do, you need to use RDDs
uid_rdd = data\
.select("user")\
.distinct()\
.rdd.map(lambda x : x["user"])\
.zipWithIndex()
uid_map = spark.createDataFrame(uid_rdd, ["user", "user_idx"])
关于apache-spark - 在 Spark ML 中,为什么在具有数百万个不同值的列上安装 StringIndexer 会产生 OOM 错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52000138/
Apache Spark StringIndexerModel 在对某一特定列进行转换后返回空数据集。我正在使用成人数据集:http://mlr.cs.umass.edu/ml/datasets/Ad
我正在尝试对一列句子执行 StringIndexer 操作,即将单词列表转换为整数列表。 例如: 输入数据集: (1, ["I", "like", "Spark"]) (2, ["I", "h
我的 java 脚本有以下问题。 我有jQuery对象。在本地获取其值的第 i 个符号,我使用以下代码 $(this).val()[i]; 当我在服务器中部署此代码时,此行开始抛出异常,表示 $(th
我正在使用 PySpark 通过 ALS 进行协同过滤。我的原始用户和项目 ID 是字符串,所以我使用了 StringIndexer将它们转换为数字索引(PySpark 的 ALS 模型要求我们这样做
我的 PipelinedRDD 中有一列标称值,我希望将其转换为索引编码以用于分类目的。 我曾经在pyspark.ml中使用StringIndexer,它非常容易使用。不过,这次我正在学习如何处理 r
PySpark - v2.4.0 我尝试将 String 列 Country 转换为 Interger 列 Country_ID,结果看起来不错。但是当我尝试访问 Country_ID 列时,我得到了
Dataset dataFrame = ... ; StringIndexerModel labelIndexer = new StringIndexer() .se
我有格式化为以下示例的大数据记录: // +---+------+------+ // |cid|itemId|bought| // +---+------+------+ // |abc| 12
我收到了 StringIndex我正在处理的 10,000 个字符串中的一个特定字符串的错误。我真的不知道这个字符串有什么问题。我想这可能是一个特殊的性格问题。 如果我 println然后将该字符串分
我的目标是建立一个multicalss分类器。 我已经建立了用于特征提取的管道,并且第一步包括StringIndexer转换器,将每个类名称映射到标签,该标签将在分类器训练步骤中使用。 管道已安装培训
如何从经过训练的 Spark MLlib StringIndexerModel 中获取映射? val stringIndexer = new StringIndexer() .setInput
如何通过从 labelIndexer 获取标签,使用 IndexToString 进行转换? labelIndexer = StringIndexer(inputCol="shutdown_reaso
我有一个包含一些分类字符串列的数据集,我想用 double 类型表示它们。我使用 StringIndexer 进行此转换并且它有效,但是当我在另一个具有 NULL 值的数据集中尝试它时,它给出了 ja
当我使用 StringIndexer 和 OneHot Encoder 为我的矩阵准备数据时,我现在如何知道重要特征的名称/来源是什么? randomForest 分类器只会给我索引,我看不到原始数据
我正在使用 Scala 并使用 StringIndexer 为训练集中的每个类别分配索引。它根据每个类别的频率分配索引。 问题是在我的测试数据中,类别的频率不同,因此 StringIndexer 为类
我正在使用 Spark 和 pyspark 并且我有一个 pipeline 设置了一堆 StringIndexer 对象,我用它来将字符串列编码为索引列: indexers = [StringInde
我有一个 PySpark 数据框 +-------+--------------+----+----+ |address| date|name|food| +-------+----
我正在尝试在具有大约 15.000.000 个唯一字符串值的列上使用 Spark 的 StringIndexer 特征转换器。无论我投入多少资源,Spark 总是会因某种内存不足异常而死在我身上。 f
我是一名优秀的程序员,十分优秀!