av9ash/GitBugs huggingface dataset:
Bug: Spark 3.3.2, with hadoop3,  Error with java.io.IOException: Mkdirs failed to create file
Status: Open | Priority: Major | Resolution: 
Created: 27/Mar/23 07:31
Affects Version/s: 3.3.2

We are using spark 3.3.2 with hadoop 3  coming with spark.

[https://www.apache.org/dyn/closer.lua/spark/spark-3.3.2/spark-3.3.2-bin-hadoop3.tgz] 

[https://www.apache.org/dyn/closer.lua/spark/spark-3.3.2/spark-3.3.2-bin-hadoop2.tgz] 

Spark in our application is used as standalone , and we are not using HDFS file system.

Spark is writing on local file system.

Same spark version 3.3.2 is working fine with hadoop 2. but with hadoop 3 , we are getting below issue. 

 

23/03/18 20:23:24 WARN TaskSetManager: Lost task 4.0 in stage 0.0 (TID 4) (10.64.109.72 executor 0): java.io.IOException: Mkdirs failed to create [file:/var/backup/_temporary/0/_temporary/attempt_202301182023173234741341853025716_0005_m_000004_0|file://var/backup/_temporary/0/_temporary/attempt_202301182023173234741341853025716_0005_m_000004_0] (exists=false, cwd=[file:/opt/spark-3.3.2/work/app-20230118202317-0001/0|file://opt/spark-3.3.0/work/app-20230118202317-0001/0])
        at org.apache.hadoop.fs.ChecksumFileSystem.create(ChecksumFileSystem.java:515)
        at org.apache.hadoop.fs.ChecksumFileSystem.create(ChecksumFileSystem.java:500)
        at org.apache.hadoop.fs.FileSystem.create(FileSystem.java:1195)
        at org.apache.hadoop.fs.FileSystem.create(FileSystem.java:1081)
        at org.apache.hadoop.mapred.TextOutputFormat.getRecordWriter(TextOutputFormat.java:113)
        at org.apache.spark.internal.io.HadoopMapRedWriteConfigUtil.initWriter(SparkHadoopWriter.scala:238)
        at org.apache.spark.internal.io.SparkHadoopWriter$.executeTask(SparkHadoopWriter.scala:126)
        at org.apache.spark.internal.io.SparkHadoopWriter$.$anonfun$write$1(SparkHadoopWriter.scala:88)
        at org.apache.spark.scheduler.ResultTask.runTask(ResultTask.scala:90)
        at org.apache.spark.scheduler.Task.run(Task.scala:136)
        at org.apache.spark.executor.Executor$TaskRunner.$anonfun$run$3(Executor.scala:548)
        at org.apache.spark.util.Utils$.tryWithSafeFinally(Utils.scala:1504)
        at org.apache.spark.executor.Executor$TaskRunner.run(Executor.scala:551)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
        at java.lang.Thread.run(Thread.java:750)
Bug: dropDuplicates within watermark
Status: Resolved | Priority: Major | Resolution: Fixed
Created: 27/Mar/23 07:09
Affects Version/s: 3.5.0

We got many reports that dropDuplicates does not clean up the state even though they have set a watermark for the query. We document the behavior clearly that the event time column should be a part of the subset columns for deduplication to clean up the state, but it cannot be applied to the customers as timestamps are not exactly the same for duplicated events in their use cases.

We propose to deduce a new API of dropDuplicates which has following different characteristics compared to existing dropDuplicates:
 * Weaker constraints on the subset (key)
 ** Does not require an event time column on the subset.
 * Looser semantics on deduplication
 ** Only guarantee to deduplicate events within the watermark.

Since the new API leverages event time, the new API has following new requirements:
 * The input must be streaming DataFrame.
 * The watermark must be defined.
 * The event time column must be defined in the input DataFrame.

More specifically on the semantic, once the operator processes the first arrived event, events arriving within the watermark for the first event will be deduplicated.
(Technically, the expiration time should be the “event time of the first arrived event + watermark delay threshold”, to match up with future events.)

Users are encouraged to set the delay threshold of watermark longer than max timestamp differences among duplicated events. (If they are unsure, they can alternatively set the delay threshold large enough, e.g. 48 hours.)

Longer design doc will be attached.
Bug: Fix the error message of createDataFrame from np.array(0)
Status: Resolved | Priority: Major | Resolution: Fixed
Created: 30/Mar/23 21:16
Affects Version/s: 3.4.0

{code:python}
>>> import numpy as np
>>> spark.createDataFrame(np.array(0))
Traceback (most recent call last):
...
TypeError: len() of unsized object
{code}
Bug: Fix DataFrame.collect with null struct.
Status: Resolved | Priority: Major | Resolution: Fixed
Created: 31/Mar/23 22:30
Affects Version/s: 3.4.0

In Spark Connect:

{code:python}
>>> df = spark.sql("values (1, struct('a' as x)), (null, null) as t(a, b)")
>>> df.show()
+----+----+
|   a|   b|
+----+----+
|   1| {a}|
|null|null|
+----+----+

>>> df.collect()
[Row(a=1, b=Row(x='a')), Row(a=None, b=<Row()>)]
{code}

whereas PySpark:

{code:python}
>>> df.collect()
[Row(a=1, b=Row(x='a')), Row(a=None, b=None)]
{code}
Bug: Optimze shuffle for union spark plan
Status: Open | Priority: Major | Resolution: 
Created: 27/Mar/23 13:55
Affects Version/s: 3.5.0

Union plan does not take full advantage of children plan output partitionings when output partitoning can't match parent plan's required distribution. For example, Table1 and table2 are all bucketed table with bucket column id and bucket number 100. We will do row_number window function after union the two tables.
{code:sql}
create table table1 (id int, name string) using csv CLUSTERED BY (id) INTO 100 BUCKETS;
insert into table1 values(1, "s1");
insert into table1 values(2, "s2");
​
create table table2 (id int, name string) using csv CLUSTERED BY (id) INTO 100 BUCKETS;
insert into table2 values(1, "s3");
​
set spark.sql.shuffle.partitions=100;
set spark.sql.unionRequiredDistributionPushdown.enabled=true;
explain select *, row_number() over(partition by id order by name desc) id_row_number from (select * from table1 union all select * from table2);{code}
The physical plan is 
{code:bash}
AdaptiveSparkPlan isFinalPlan=false
+- Window row_number() windowspecdefinition(id#35, name#36 DESC NULLS LAST, specifiedwindowframe(RowFrame, unboundedpreceding$(), currentrow$())) AS id_row_number#28, id#35, name#36 DESC NULLS LAST
  +- Sort id#35 ASC NULLS FIRST, name#36 DESC NULLS LAST, false, 0
     +- Exchange hashpartitioning(id#35, 100), ENSURE_REQUIREMENTS, [plan_id=88]
        +- Union
           :- FileScan csv spark_catalog.default.table1id#35,name#36
           +- FileScan csv spark_catalog.default.table2id#37,name#38 {code}
 

Although the two tables are bucketed by id column, there's still a exchange plan after union.The reason is that union plan's output partitioning is null.

We can indroduce a new idea to optimize exchange plan:
 # First introduce a new RDD, it consists of parent rdds that has the same partition size. The ith parttition corresponds to ith partition of each parent rdd.

 # Then push the required distribution to union plan's children. If any child output partitioning matches the required distribution , we can reduce this child shuffle operation.

After doing these, the physical plan does not contain exchange shuffle plan
{code:bash}
AdaptiveSparkPlan isFinalPlan=false
+- Window row_number() windowspecdefinition(id#7, name#8 DESC NULLS LAST, specifiedwindowframe(RowFrame, unboundedpreceding$(), currentrow$())) AS id_row_number#0, id#7, name#8 DESC NULLS LAST
  +- Sort id#7 ASC NULLS FIRST, name#8 DESC NULLS LAST, false, 0
     +- UnionZip ClusteredDistribution(ArrayBuffer(id#7),false,None), ClusteredDistribution(ArrayBuffer(id#9),false,None), hashpartitioning(id#7, 200)
        :- FileScan csv spark_catalog.default.table1id#7,name#8
        +- FileScan csv spark_catalog.default.table2id#9,name#10 {code}
Bug: Fix the comparison the result with Arrow optimization enabled/disabled.
Status: Resolved | Priority: Major | Resolution: Fixed
Created: 29/Mar/23 21:40
Affects Version/s: 3.4.0

in {{{}test_arrow{}}}, there are a bunch of comparison between DataFrames with Arrow optimization enabled/disabled.

These should be fixed to compare with the expected values so that it can be reusable for Spark Connect parity tests.
Bug: Fix SparkListenerTaskStart.stageAttemptId when a task is started after the stage is cancelled
Status: Resolved | Priority: Major | Resolution: Fixed
Created: 29/Mar/23 18:26
Affects Version/s: 3.0.3

When a task is started after the stage is cancelled, the stageAttemptId field in  SparkListenerTaskStart event is set to -1. This could lead to unexpected problem for subscribers of SparkListener because -1 is not a legal stageAttemptId.
Bug: lightweight Broadcast implementation
Status: Open | Priority: Major | Resolution: 
Created: 30/Mar/23 17:42
Affects Version/s: 3.4.0

The current TorrentBroadcast implementation is originally designed for large data transmission where driver might become the bottleneck and memory might also be the concern. Therefore it's kind of heavy and comes with some fixed overhead:
 * torrent protocol: more round traffic
 * disk level persistency, BlockManager, extra overhead

which makes it inefficient for some small data transmission.

We can have a lightweight broadcast implementation, e.g, SmallBroadcast, which implement star-topology broadcast(which avoids the unnecessary round traffic), and maybe in-memory only.
Bug: Define literal constructors as keywords
Status: Resolved | Priority: Major | Resolution: Fixed
Created: 30/Mar/23 13:23
Affects Version/s: 3.5.0

Currently, Spark SQL defines literal constructors as:

 
{code}
| identifier stringLit #typeConstructor
{code}
where identifier is parsed later by visitTypeConstructor():

{code:scala}
    valueType match {
      case "DATE" =>
        val zoneId = getZoneId(conf.sessionLocalTimeZone)
        val specialDate = convertSpecialDate(value, zoneId).map(Literal(_, DateType))
        specialDate.getOrElse(toLiteral(stringToDate, DateType))
      case "TIMESTAMP_NTZ" =>
...
{code}

So, the literal constructors are not Spark SQL keywords, and this causes some inconveniences while analysing/transforming the lexer tree. For example, while forming the stable column aliases.

Need to define literal constructors in SqlBaseParser.g4.
Bug: Define Spark SQL types as keywords
Status: Resolved | Priority: Major | Resolution: Fixed
Created: 20/Mar/23 16:12
Affects Version/s: 3.5.0

Currently, Spark SQL defines primitive types as:

 
{code}
| identifier (LEFT_PAREN INTEGER_VALUE
  (COMMA INTEGER_VALUE)* RIGHT_PAREN)?                      #primitiveDataType
{code}
where identifier is parsed later by visitPrimitiveDataType():

{code:scala}
  override def visitPrimitiveDataType(ctx: PrimitiveDataTypeContext): DataType = withOrigin(ctx) {
    val dataType = ctx.identifier.getText.toLowerCase(Locale.ROOT)
    (dataType, ctx.INTEGER_VALUE().asScala.toList) match {
      case ("boolean", Nil) => BooleanType
      case ("tinyint" | "byte", Nil) => ByteType
      case ("smallint" | "short", Nil) => ShortType
      case ("int" | "integer", Nil) => IntegerType
      case ("bigint" | "long", Nil) => LongType
      case ("float" | "real", Nil) => FloatType
...
{code}

So, the types are not Spark SQL keywords, and this causes some inconveniences while analysing/transforming the lexer tree. For example, while forming the stable column aliases.

Need to define Spark SQL types in SqlBaseLexer.g4.

Also, typed literals have the same issue. The types "DATE", "TIMESTAMP_NTZ", "TIMESTAMP", "TIMESTAMP_LTZ", "INTERVAL", and "X" should be defined as base lexer tokens.
Bug: Automatically rename metadata columns that conflict with data schema columns
Status: Resolved | Priority: Major | Resolution: Fixed
Created: 06/Mar/23 14:17
Affects Version/s: 3.3.2

Today, if a datasource already has a column called `_metadata`, queries cannot access the file-source metadata column that normally carries that name. We can address this conflict with two changes to metadata column handling:
 # Automatically rename any metadata column whose name conflicts with a data schema column
 # Add a facility to reliably find metadata columns by their original/logical name, even if they were renamed.
Bug: When processing the WorkDirCleanup event, if appDirs is empty, should print workdir 
Status: Resolved | Priority: Major | Resolution: Fixed
Created: 30/Mar/23 00:48
Affects Version/s: 3.4.0

          val appDirs = workDir.listFiles()
          if (appDirs == null) {
            throw new IOException(
              s"ERROR: Failed to list files in ${appDirs.mkString("dirs(", ", ", ")")}")
          }

 

Otherwise, npe will be thrown here when appDirs is null
Bug: Make memory stream implement SupportsReportStatistics
Status: Open | Priority: Major | Resolution: 
Created: 29/Mar/23 17:29
Affects Version/s: 3.5.0

Memory stream is pretty convenient when writing Structured Streaming tests. However, it doesn't implement SupportsReportStatistics.

Would be great to implement SupportsReportStatistics so that we can also use memory stream to write tests that need to use stats.
Bug: ValueError when invoking any session operations on a stopped Spark session
Status: Resolved | Priority: Major | Resolution: Fixed
Created: 22/Mar/23 08:58
Affects Version/s: 3.5.0

If a remote Spark session is stopped, trying to invoke any session operations will result in a ValueError. For example:

 
{code:java}
spark.stop()
spark.sql("select 1")

ValueError: Cannot invoke RPC: Channel closed!
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
  ...
    return e.code() == grpc.StatusCode.UNAVAILABLE
AttributeError: 'ValueError' object has no attribute 'code'{code}
Bug: Sensitive data could still be exposed by variable substitution
Status: Resolved | Priority: Major | Resolution: Fixed
Created: 28/Mar/23 08:48
Affects Version/s: 3.3.2

Case 1 by SET syntax's key part

 
{code:java}
Time taken: 0.017 seconds, Fetched 1 row(s)
spark-sql> set ${spark.ssl.keyPassword}
         > ;
abc    <undefined> {code}
Case 2 by SELECT as String lit

 
{code:java}
spark-sql> set spark.ssl.keyPassword;
spark.ssl.keyPassword    *********(redacted)
Time taken: 0.009 seconds, Fetched 1 row(s)
spark-sql> select '${spark.ssl.keyPassword}'
         > ;
abc
{code}
Bug: Unresolved having at the end of analysis when using with LCA with the having clause that can be resolved directly by its child Aggregate
Status: Resolved | Priority: Major | Resolution: Fixed
Created: 27/Mar/23 17:54
Affects Version/s: 3.4.0

{code:java}
select sum(value1) as total_1, total_1
from values(1, 'name', 100, 50) AS data(id, name, value1, value2)
having total_1 > 0

SparkException: [INTERNAL_ERROR] Found the unresolved operator: 'UnresolvedHaving (total_1#353L > cast(0 as bigint)) {code}
To trigger the issue, the having condition need to be (can be resolved by) an attribute in the select.
Without the LCA {{{}total_1{}}}, the query works fine.
Bug: PySpark: dropDuplicates within watermark
Status: Open | Priority: Major | Resolution: 
Created: 27/Mar/23 08:46
Affects Version/s: 3.5.0

This is a follow-up issue for SPARK-42931 to ease of review for SPARK-42931.

Add equivalent public API where we add in SPARK-42931 to PySpark, and also add a code example for PySpark in the guide doc.

Once we merge SPARK-42931, this ticket should be ideally marked as blocker.
Bug: SQLQueryTestSuite test failed with `SPARK_ANSI_SQL_MODE=true`
Status: Resolved | Priority: Major | Resolution: Fixed
Created: 25/Mar/23 02:45
Affects Version/s: 3.5.0

Run 
{code:java}
SPARK_ANSI_SQL_MODE=true build/sbt "sql/testOnly org.apache.spark.sql.SQLQueryTestSuite" {code}
{code:java}
[info] - timestampNTZ/datetime-special.sql_analyzer_test *** FAILED *** (11 milliseconds)
[info]   timestampNTZ/datetime-special.sql_analyzer_test
[info]   Expected "...date(999999, 3, 18, [false) AS make_date(999999, 3, 18)#x, make_date(-1, 1, 28, fals]e) AS make_date(-1, ...", but got "...date(999999, 3, 18, [true) AS make_date(999999, 3, 18)#x, make_date(-1, 1, 28, tru]e) AS make_date(-1, ..." Result did not match for query #1
[info]   select make_date(999999, 3, 18), make_date(-1, 1, 28) (SQLQueryTestSuite.scala:777)
[info]   org.scalatest.exceptions.TestFailedException: {code}
Bug: Some cases do not take effect when using OptimizeSkewInRebalancePartitions
Status: Closed | Priority: Major | Resolution: Fixed
Created: 24/Mar/23 03:26
Affects Version/s: 3.3.0

Questioin:

When using OptimizeSkewInRebalancePartitions to insert dynamic partitions (three-level partitions) into the hive table (partitions are skewed), it is found that when spark.sql.shuffle.partitions is set to a relatively large value (10000), the written results do not follow the preset advisoryPartitionSizeInBytes Size to file (the skewed partition data is only processed by one task and written into one file), but when I reduce spark.sql.shuffle.partitions (2000), I found that the skewed partition can be optimized according to OptimizeSkewInRebalancePartitions Data is processed in batches and written to a file.

 

spark aqe config:

spark.sql.adaptive.coalescePartitions.enabled true
spark.sql.adaptive.skewedJoin.enabled true
spark.sql.adaptive.advisoryPartitionSizeInBytes 128M
spark.sql.finalStage.adaptive.advisoryPartitionSizeInBytes 512M
spark.sql.finalStage.adaptive.coalescePartitions.minPartitionSize 128M
spark.sql.finalStage.adaptive.coalescePartitions.parallelismFirst false
spark.sql.adaptive.skewJoin.skewedPartitionThresholdInBytes  1024M

 

10000 partitions

!image-2023-03-24-11-30-42-239.png|width=929,height=150!

 

 

2000 partition:

!image-2023-03-24-11-31-42-564.png|width=936,height=172!

 

 

sql time

!image-2023-03-24-11-34-34-070.png|width=962,height=220!

 

 

plan:

!image-2023-03-24-11-36-54-539.png|width=339,height=389!

 

 

 

!image-2023-03-24-11-37-42-289.png|width=334,height=306!
Bug: INSERT INTO with column list does not work
Status: Resolved | Priority: Major | Resolution: Duplicate
Created: 23/Mar/23 12:32
Affects Version/s: 3.3.2

Hi,

When performing a INSERT INTO with a defined incomplete column list, the missing columns should get a NULL value. However, an error is thrown indicating that the column is missing.

*Case simulation:*

drop table if exists default.TVTest;
create table default.TVTest
( col1 int NOT NULL
, col2 int
);
insert into default.TVTest select 1,2;
insert into default.TVTest select 2,NULL; --> col2 can contain NULL values
insert into default.TVTest (col1) select 3; -- Error in SQL statement: DeltaAnalysisException: Column col2 is not specified in INSERT
insert into default.TVTest (col1) VALUES (3); -- Error in SQL statement: DeltaAnalysisException: Column col2 is not specified in INSERT
select * from default.TVTest;
Bug: Should move message StorageLevel from `base.proto` to a separate file
Status: Resolved | Priority: Major | Resolution: Fixed
Created: 23/Mar/23 00:42
Affects Version/s: 3.4.0

[https://github.com/apache/spark/pull/40510] introduce `message StorageLevel` to `base.proto`, but if we try to import `base.proto` in `catalog.proto` to reuse `StorageLevel` in `message CacheTable` and run `build/sbt "connect-common/compile" to compile, there will be following message in compile log:

 
{code:java}
spark/connect/base.proto:23:1: File recursively imports itself: spark/connect/base.proto -> spark/connect/commands.proto -> spark/connect/relations.proto -> spark/connect/catalog.proto -> spark/connect/base.proto
spark/connect/catalog.proto:22:1: Import "spark/connect/base.proto" was not found or had errors.
spark/connect/catalog.proto:144:12: "spark.connect.DataType" seems to be defined in "spark/connect/types.proto", which is not imported by "spark/connect/catalog.proto".  To use it here, please add the necessary import.
spark/connect/catalog.proto:161:12: "spark.connect.DataType" seems to be defined in "spark/connect/types.proto", which is not imported by "spark/connect/catalog.proto".  To use it here, please add the necessary import.
spark/connect/relations.proto:25:1: Import "spark/connect/catalog.proto" was not found or had errors.
spark/connect/relations.proto:84:5: "Catalog" is not defined.
spark/connect/commands.proto:22:1: Import "spark/connect/relations.proto" was not found or had errors.
spark/connect/commands.proto:63:3: "Relation" is not defined.
spark/connect/commands.proto:81:3: "Relation" is not defined.
spark/connect/commands.proto:142:3: "Relation" is not defined.
spark/connect/base.proto:23:1: Import "spark/connect/commands.proto" was not found or had errors.
spark/connect/base.proto:25:1: Import "spark/connect/relations.proto" was not found or had errors.
.... {code}
So we should move `message StorageLevel` from `base.proto` to a separate file to avoid this issue
Bug: Server-side Artifact Management
Status: Resolved | Priority: Major | Resolution: Fixed
Created: 10/Mar/23 14:24
Affects Version/s: 3.4.0

https://issues.apache.org/jira/browse/SPARK-42653 implements the client-side transfer of artifacts to the server but currently, the server does not process these requests.

 

We need to implement a server-side management mechanism to handle storage of these artifacts on the driver as well as perform further processing (such as adding jars and moving class files to the right directories)
Bug: Implement Pandas API Missing Parameters
Status: Resolved | Priority: Major | Resolution: Resolved
Created: 21/Mar/23 09:38
Affects Version/s: 3.4.0

pandas API on Spark aims to make pandas code work on Spark clusters without any changes. So full API coverage has been one of our major goals. Currently, most pandas functions are implemented, whereas some of them are have incomplete parameters support.

There are some common parameters missing (resolved):
 * How to do with NAs   
 * Filter data types    
 * Control result length    
 * Reindex result   

There are remaining missing parameters to implement (see doc below).

See the design and the current status at [https://docs.google.com/document/d/1H6RXL6oc-v8qLJbwKl6OEqBjRuMZaXcTYmrZb9yNm5I/edit?usp=sharing].
Bug: Support parameterized CTE
Status: Resolved | Priority: Major | Resolution: Fixed
Created: 07/Mar/23 14:48
Affects Version/s: 3.4.0

Support named parameters in named common table expressions (CTE). At the moment, such queries failed:
{code:java}
CREATE TABLE tbl(namespace STRING) USING parquet
INSERT INTO tbl SELECT 'abc'
WITH transitions AS (
  SELECT * FROM tbl WHERE namespace = :namespace
) SELECT * FROM transitions {code}
w/ the following error:
{code:java}
[UNBOUND_SQL_PARAMETER] Found the unbound parameter: `namespace`. Please, fix `args` and provide a mapping of the parameter to a SQL literal.; line 3 pos 38;
'WithCTE
:- 'CTERelationDef 0, false
:  +- 'SubqueryAlias transitions
:     +- 'Project [*]
:        +- 'Filter (namespace#3 = parameter(namespace))
:           +- SubqueryAlias spark_catalog.default.tbl
:              +- Relation spark_catalog.default.tbl[namespace#3] parquet
+- 'Project [*]
   +- 'SubqueryAlias transitions
      +- 'CTERelationRef 0, falseorg.apache.spark.sql.AnalysisException: [UNBOUND_SQL_PARAMETER] Found the unbound parameter: `namespace`. Please, fix `args` and provide a mapping of the parameter to a SQL literal.; line 3 pos 38;
'WithCTE
:- 'CTERelationDef 0, false
:  +- 'SubqueryAlias transitions
:     +- 'Project [*]
:        +- 'Filter (namespace#3 = parameter(namespace))
:           +- SubqueryAlias spark_catalog.default.tbl
:              +- Relation spark_catalog.default.tbl[namespace#3] parquet
+- 'Project [*]
   +- 'SubqueryAlias transitions
      +- 'CTERelationRef 0, false    at org.apache.spark.sql.catalyst.analysis.package$AnalysisErrorAt.failAnalysis(package.scala:52)
    at org.apache.spark.sql.catalyst.analysis.CheckAnalysis.$anonfun$checkAnalysis0$5(CheckAnalysis.scala:339)
    at org.apache.spark.sql.catalyst.analysis.CheckAnalysis.$anonfun$checkAnalysis0$5$adapted(CheckAnalysis.scala:244) {code}