通过 jenkins 运行 SonarQube 分析,为 Spark Scala 代码抛出 *** 错误
Posted
技术标签:
【中文标题】通过 jenkins 运行 SonarQube 分析,为 Spark Scala 代码抛出 *** 错误【英文标题】:Running SonarQube analysis via jenkins throwing *** error for Spark Scala code 【发布时间】:2021-12-13 15:51:51 【问题描述】:我有一个 spark scala 应用程序,它运行良好,在 jenkins 构建和本地构建中没有任何问题。对于其中一种方法,我们使用 160 withColumn 向数据框添加列。我们要求再增加两列。当我添加它时,本地和 EMR 的一切都运行良好,但是当添加这两列时,声纳分析会引发 *** 错误。如果我删除它,则没有问题。不确定 jenkins 容器是否有足够的资源。尝试使用不同的声纳扫描仪版本,都失败了,但是单元测试,代码覆盖在本地和詹金斯工作正常,只有声纳扫描仪失败。 Jenkins error 1 Jenkins error 2
我是否需要重写代码以不多次使用 withcolumns ? 或者这是在声纳扫描仪或詹金斯级别解决的问题?
除了使用 160 次 withcolumn 之外,还有更好的添加列的方法吗?
SonarScanner - 4.6.1.2450 Scala - 2.12 sbt - 1.4.6 val tempDf = slimDf.withColumn("AAA", concat($"post_visid", $"post_visid")).drop("post_visid").drop("post_visid")
.withColumnRenamed("aaa", "VST_SEQ_NUM")
.withColumnRenamed("bbb", "PGVW_SEQ_NUM")
.withColumn("ddd", to_date($"date_time"))
.withColumn("ccc", date_format($"date_time", "HH:mm:ss"))
.withColumn("eee", truncateStringUDF($"evar60", lit(255)))
.withColumnRenamed("fff", "PAGE_EVT_ID")
.withColumn("ggg", when($"hhh" === 0 || $"hhh" === 70, true).otherwise(false))
.withColumn("iii", truncateStringUDF($"page_event_var1", lit(1000)))
.withColumn("jjj", truncateStringUDF($"page_event_var2", lit(1000)))
.withColumn("kkk", truncateStringUDF($"post_prop11", lit(255)))
.withColumn("lll", truncateStringUDF($"exclude_hit", lit(255)))
.withColumn("mmm", truncateStringUDF($"post_prop9", lit(1000)))
.withColumn("FRST4", when($"daily_visitor" === 0, "N").otherwise("Y")).drop("daily_visitor")
.withColumn("FRST3", when($"hourly_visitor" === 0, "N").otherwise("Y")).drop("hourly_visitor")
.withColumn("FRST1", when($"weekly_visitor" === 0, "N").otherwise("Y")).drop("weekly_visitor")
.withColumn("FRST2", when($"monthly_visitor" === 0, "N").otherwise("Y")).drop("monthly_visitor")
.withColumn("FRST_QTRLY_VST_IND", when($"quarterly_visitor" === 0, "N").otherwise("Y")).drop("quarterly_visitor")
与此类似,总共有 160 个带列,将总共 160 列添加到数据框
【问题讨论】:
请通过编辑您的问题分享任何相关代码 - instead of a screenshot。如果您的代码没有以可复制的形式出现,那么很少有人会重现您的问题。 请提供足够的代码,以便其他人更好地理解或重现问题。 【参考方案1】:Scala 解析器通常假定代码由小块组成,它不太适合其他程序发出的代码,或者通常仅适用于嵌套极深的代码。特别是,无论是 Scala 编译器本身,还是 Scalameta 的解析器,在面对嵌套极深的术语时,似乎都不是堆栈安全的。
例如,以下更简单的示例使scala
和sonar-scanner
(依赖于scalameta
)崩溃:
object Foo
def main(args: Array[String]): Unit =
val y = "foo"
.trim()
.trim()
.trim()
.trim()
.trim()
.trim()
.trim()
// repeat .trim() ~250 times
println(y)
只需将巨大的表达式大致切成两半,并引入一个额外的变量:
object Foo
def main(args: Array[String]): Unit =
val x = "foo"
.trim()
.trim()
.trim()
.trim()
.trim()
.trim()
.trim()
// repeat .trim() ~100 times
val y = x
.trim()
// repeat .trim() ~100 more times
println(y)
这适用于scala
-interpreter 和sonar-scanner
的最新版本。
【讨论】:
我会试试这个并告诉你,谢谢以上是关于通过 jenkins 运行 SonarQube 分析,为 Spark Scala 代码抛出 *** 错误的主要内容,如果未能解决你的问题,请参考以下文章
即使在 Jenkins 构建上禁用了浅层,SonarQube 也会发出浅层克隆警告