簡體   English   中英

java.lang.IllegalArgumentException: 非法序列邊界 Spark

[英]java.lang.IllegalArgumentException: Illegal sequence boundaries Spark

我正在使用 Azure Databricks 和 Scala。 我想顯示()一個數據框,但我遇到了一個我無法理解的錯誤,我想解決它。 我擁有的代碼行是:

println("----------------------------------------------------------------Printing schema")
df.printSchema()
println("----------------------------------------------------------------Printing dataframe")
df.show()
println("----------------------------------------------------------------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.

如果沒有看到您的代碼,很難確切知道,但我有一個類似的錯誤,另一個答案(關於int超出范圍)使我誤入歧途。

您得到的java.lang.IllegalArgumentException令人困惑,但實際上非常具體:

Illegal sequence boundaries: 1581897600000000 to 1581811200000000 by 86400000000

此錯誤抱怨您正在使用sequence() spark SQL 函數,並且您告訴它15818976000000001581811200000000乘以86400000000。由於數字很大,很容易錯過,但這是一條更大數字開始的指令一個正整數的增量數量較少。 例如,126乘以3。

根據DataBricks 文檔,這是不允許的

  • 開始 - 一個表達式。 范圍的開始。
  • 停止 - 一個表達。 結束范圍(包括)。
  • step - 可選表達式。 范圍的步長。 默認情況下,如果 start 小於或等於 stop,則 step 為 1,否則為 -1。 對於時間序列,分別為 1 天和 -1 天。 如果 start 大於 stop 則步長必須為負,反之亦然。

此外,我認為另一個答案對int列的關注具有誤導性。 非法序列錯誤中提到的大量數字看起來像是來自日期列。 您沒有任何 DateType 列,但您的字符串列的名稱類似於日期列; 大概您在序列函數中使用它們,並且它們被強制轉換為日期。

您的架構需要一個 int, Java 中int 的最大大小為 [-2 147 483 648 到 +2 147 483 647]

所以我會將架構從 int 更改為 long。

當您嘗試執行此操作時可能會收到此錯誤

sequence(start_date, end_date, [interval]) 

在某些 start_dates 小於 end_dates 和其他大於的表上

應用此函數時,所有日期范圍都應為正數或負數,而不是混合

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM