当前位置: 首页 > 知识库问答 >
问题:

isin在spark中的With Column函数中抛出stackoverflow错误

韩恺
2023-03-14

我在scala应用程序中使用Spark2.3。我有一个从spark sql创建的dataframe,在我共享的示例代码中名为sqlDF。我有一个字符串列表,其中包含以下项

column1 | column2 | column3
1       |1        |1       
2       |-5       |1       
6       |-6       |1       
-7      |-8       |-7       
column1 | column2 | column3
1       |1        |1       
2       |-5       |1       
6       |0        |1       
0       |0        |0

为此,我在下面对SQLDF中的所有列(超过500列)进行查询。

sqlDF = sqlDF.withColumn(currColumnName, when(col(currColumnName).isin(stringList:_*), 0).otherwise(col(currColumnName)))

但是得到下面的错误,顺便说一下,如果我只选择一列进行迭代,它可以工作,但是如果我运行上面的代码进行500列迭代,它就失败了

线程“streaming-job-executor-0”java.lang.stackOverflowError在scala.collection.generic.gentraversableFactory$GenericCanBuildFrom.apply(gentraversableFactory.scala:57)在scala.collection.generic.gentraversableFactory$GenericCanBuildFrom.apply(gentraversableFactory.scala:52)在scala.collection.traversableFactory$class.builder$1(traversableLike.scala:229)在scala.collection.traversableLike$class.builder在org.apache.spark.sql.catalyst.trees.treenode$$Anonfun$4.在org.apache.spark.sql.catalyst.trees.treenode.MapProductIterator(Treenode.scala:187)申请(Treenode.scala:333)

我缺少的是什么?

共有1个答案

闻人德庸
2023-03-14

这里有一种不同的方法,在columnxX之间应用left antijoin,其中X是传输到DataFrame中的项列表。左反联接将返回x中不存在的所有项,结果我们通过一个外部联接将它们连接在一起(为了更好的性能,可以用左联接代替外部联接,但这将根据用monotonically_recreasing_id分配的id排除所有为零的记录,即id==3):

import org.apache.spark.sql.functions.{monotonically_increasing_id, col}

val df = Seq(
(1, 1, 1),       
(2, -5, 1),       
(6, -6, 1),       
(-7, -8, -7))
.toDF("c1", "c2", "c3")
.withColumn("id", monotonically_increasing_id())

val exdf = Seq(-9, -8, -7, -6).toDF("x")

df.columns.map{ c =>
   df.select("id", c).join(exdf, col(c) === $"x", "left_anti")
}
.reduce((df1, df2) => df1.join(df2, Seq("id"), "outer"))
.na.fill(0)
.show

产出:

+---+---+---+---+
| id| c1| c2| c3|
+---+---+---+---+
|  0|  1|  1|  1|
|  1|  2| -5|  1|
|  3|  0|  0|  0|
|  2|  6|  0|  1|
+---+---+---+---+
 类似资料:
  • 我有一个类(我不能修改),它只有一个构造函数,它接受一个参数,如下所示: 由于构造函数可以抛出错误,我想实现错误处理。我的第一次尝试是: 但是,现在在块的范围内,不能在其他地方使用。如果我理解正确,我不能在没有初始化的情况下声明对象,因此我可以在块之外声明。那么,我该如何捕捉构造函数抛出的错误呢? 编辑:为了澄清,这是在我的中,在中我将中止程序。此外,参数是一个将被打开的文件,因此没有已知的安全输

  • 在Javascript中的异步生成器函数中,第一个参数本身就是一个异步生成器函数,该函数用于转换函数。在函数中有一个转换和一个检查。如果检查不正确,应中止发电机功能。如果检查正确,则应得出结果。我用随机数模拟了误差。 我找到了三种抛出错误的方法: 返回Promise.reject(新的错误(一些消息); 抛出新的错误(一些消息。); 产生Promise.reject(新的错误(一些消息); 所有的

  • 问题内容: 我是Java的新手。我正在编写一个类,其中构造函数必须检查price参数并确保它不是负数。如果它是负数,则必须将价格设置为零。我检查价格时收到stackoverflow错误。我可以为我做错的事寻求帮助吗? 问题答案: 您的方法将自行调用而不是进行检查。在这种情况下,这导致无限递归。

  • 这是我的代码: 以下是我的任务要求: 一个参数化构造函数,将接收endpoint(作为点)、方向(作为int)和样式(作为字符串)。如果接收到的点或字符串为空,则抛出新的IllegalArgumentException( 我知道我检查样式是虚线、虚线还是双精度的部分出了问题,因为当我把它注释出来时,除了那个部分,所有的东西都工作了。就现在的情况而言,它只是在所有事情上抛出了非法的辩论例外。 我有一

  • 问题内容: 现在,使用Swift时,某些函数都标有,这迫使开发人员在块内调用该函数。但是开发人员如何才能知道该函数抛出的不同异常列表? 作为参考,这是一行Java代码: 很明显,例外是2 ,开发人员可以根据错误决定采取不同的操作。 我们可以在Swift上实现相同的目标吗? 问题答案: 当Swift文档说一个函数时,它们意味着它抛出一个(在Cocoa API中通常为),而不是异常。 考虑以下流量的:

  • 我试图在配置单元中执行select*from db.abc操作,此配置单元表是使用spark加载的 “它不工作”显示错误: 错误:java.io.IOException:java.lang.IllegalArgumentException:bucketId超出范围:-1(状态=,代码=0) 我需要在spark-submit或shell中添加任何属性吗?或者使用spark读取此hiv e表的另一种方