【问题标题】:java.lang.IllegalArgumentException: Illegal sequence boundaries Sparkjava.lang.IllegalArgumentException:非法序列边界 Spark
【发布时间】:2021-04-14 22:36:19
【问题描述】:

我正在使用 Azure Databricks 和 Scala。我想显示()一个数据框,但我得到了一个我无法理解的错误,我想解决它。我拥有的代码行是:

println("----------------------------------------------------------------Printing schema")
df.printSchema()
println("----------------------------------------------------------------Printing dataframe")
df.show()
println("----------------------------------------------------------------Error before")

标准输出如下,消息“------------------------------------ ----------------------------Error before" 不会出现。

>     ----------------------------------------------------------------Printing schema
>     root
>      |-- processed: integer (nullable = false)
>      |-- processDatetime: string (nullable = false)
>      |-- executionDatetime: string (nullable = false)
>      |-- executionSource: string (nullable = false)
>      |-- executionAppName: string (nullable = false)
>     
>     ----------------------------------------------------------------Printing dataframe
>     2020-02-18T14:19:00.069+0000: [GC (Allocation Failure) [PSYoungGen: 1497248K->191833K(1789440K)] 2023293K->717886K(6063104K),
> 0.0823288 secs] [Times: user=0.18 sys=0.02, real=0.09 secs] 
>     2020-02-18T14:19:40.823+0000: [GC (Allocation Failure) [PSYoungGen: 1637209K->195574K(1640960K)] 2163262K->721635K(5914624K),
> 0.0483384 secs] [Times: user=0.17 sys=0.00, real=0.05 secs] 
>     2020-02-18T14:19:44.843+0000: [GC (Allocation Failure) [PSYoungGen: 1640950K->139092K(1809920K)] 2167011K->665161K(6083584K),
> 0.0301711 secs] [Times: user=0.11 sys=0.00, real=0.03 secs] 
>     2020-02-18T14:19:50.910+0000: Track exception: Job aborted due to stage failure: Task 59 in stage 62.0 failed 4 times, most recent
> failure: Lost task 59.3 in stage 62.0 (TID 2672, 10.139.64.6, executor
> 1): java.lang.IllegalArgumentException: Illegal sequence boundaries:
> 1581897600000000 to 1581811200000000 by 86400000000
>       at org.apache.spark.sql.catalyst.expressions.GeneratedClass$GeneratedIteratorForCodegenStage23.processNext(Unknown
> Source)
>       at org.apache.spark.sql.execution.BufferedRowIterator.hasNext(BufferedRowIterator.java:43)
>       at org.apache.spark.sql.execution.WholeStageCodegenExec$$anonfun$15$$anon$2.hasNext(WholeStageCodegenExec.scala:659)
>       at scala.collection.Iterator$$anon$11.hasNext(Iterator.scala:409)
>       at org.apache.spark.shuffle.sort.BypassMergeSortShuffleWriter.write(BypassMergeSortShuffleWriter.java:125)
>       at org.apache.spark.scheduler.ShuffleMapTask.runTask(ShuffleMapTask.scala:99)
>       at org.apache.spark.scheduler.ShuffleMapTask.runTask(ShuffleMapTask.scala:55)
>       at org.apache.spark.scheduler.Task.doRunTask(Task.scala:139)
>       at org.apache.spark.scheduler.Task.run(Task.scala:112)
>       at org.apache.spark.executor.Executor$TaskRunner$$anonfun$13.apply(Executor.scala:497)
>       at org.apache.spark.util.Utils$.tryWithSafeFinally(Utils.scala:1526)
>       at org.apache.spark.executor.Executor$TaskRunner.run(Executor.scala:503)
>       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:748)
>     
>     Driver stacktrace:.
>     2020-02-18T14:19:50.925+0000: Track message: Process finished with exit code 1. Metric: Writer. Value: 1.0.

【问题讨论】:

  • 如果你能告诉我们你是如何重现问题的,这可能会有所帮助。
  • 嗯,解决任何问题的第一步是能够最小化它并使其可重现。

标签: scala apache-spark


【解决方案1】:

没有看到你的代码很难确切知道,但我遇到了类似的错误,the other answer (about int being out of range) 让我误入歧途。

您得到的java.lang.IllegalArgumentException 令人困惑,但实际上非常具体:

Illegal sequence boundaries: 1581897600000000 to 1581811200000000 by 86400000000

此错误抱怨您正在使用sequence() spark SQL 函数,并且您告诉它从 1581897600000000 1581811200000000 通过 em> 86400000000。由于数字很大,很容易错过,但这是一个从较大的数字较小的数字通过的指令正整数的增量。例如, 12 6 3.

根据the DataBricks documentation,这是不允许

  • 开始 - 一个表达式。范围的开始。
  • stop - 一个表达式。结束范围(含)。
  • step - 可选表达式。的步骤 范围。如果 start 小于,默认 step 为 1 或等于停止,否则为-1。对于时间 序列分别为 1 天和 -1 天。 如果 start 大于 stop 那么 step 必须是 负,反之亦然。

此外,我认为其他答案对int 列的关注具有误导性。非法序列错误中提到的大量数字看起来像是来自日期列。您没有任何 DateType 列,但您的字符串列被命名为日期列;大概您在序列函数中使用它们并且它们被强制转换为日期。

【讨论】:

    【解决方案2】:

    当您尝试这样做时会出现此错误

    sequence(start_date, end_date, [interval]) 
    

    在一些 start_dates 小于 end_dates 而其他更大的表上

    应用此函数时,所有日期范围应为正数或负数,不得混合

    【讨论】:

      【解决方案3】:

      您的架构需要一个 int,一个 int in Java has a maximum size of [-2 147 483 648 to +2 147 483 647]

      所以我会将架构从 int 更改为 long。

      【讨论】:

      • 你怎么知道是那个错误?你知道我怎么知道哪个专栏给了我这个问题?你会像“spark.sql(”SELECT (column_int as long)”那样改变架构吗
      • 您只有一个包含int 的列,名为processed。但是我不确定 int 是如何生成的或它来自哪里。这是一个猜测,基于可用的输入。
      猜你喜欢
      • 1970-01-01
      • 2019-04-30
      • 1970-01-01
      • 2015-04-19
      • 2016-09-26
      • 1970-01-01
      • 2017-01-24
      • 1970-01-01
      相关资源
      最近更新 更多