[英]Spark SQL table max column count
我試圖通過在列數為200+的Scala程序中創建RDD來創建spark SQL表。 當我創建模式時,編譯(sbt compile)失敗並出現java.lang.StackOverflowError異常:
StructField("RT", StringType,nullable = true) ::
StructField("SERIALNO", StringType,nullable = true) ::
StructField("SPORDER", StringType,nullable = true) ::
// ... remaining 200+ columns
無法粘貼堆棧跟蹤,因為它超過1.5k行
在將列數減少到大約100-120時,編譯成功。 此外,當我使用模式字符串創建模式(拆分模式字符串然后創建它的映射)時,編譯成功(第一個示例在https://spark.apache.org/docs/1.3中的 “以編程方式指定模式 ”標題下) 。 0 / sql-programming-guide.html )。
手動指定導致異常的模式似乎有什么問題?
這里的基本問題是您在每個StructField的每個步驟中進行列表連接。 operator ::實際上是List not StructField的成員。 雖然代碼如下:
val fields = field1 :: field2 :: field3 :: Nil
這相當於:
val fields = field1 :: (field2 :: (field3 :: Nil))
甚至
val fields = Nil.::(field1).::(field2).::(field3)
因此,在執行時,JVM需要遞歸地評估對::
方法的調用。 JVM正在增加堆棧的深度,與列表中的項目數成比例。 拆分字符串字符串和映射的原因是因為它遍歷字段名稱的拆分字符串而不是使用遞歸。
這不是Spark問題。 一旦進入數百個項目,您就可以在Scala repl中的任何類型的一系列List連接上重現相同的堆棧溢出錯誤。 只需使用其他方法之一來創建不會導致堆棧溢出的StructField列表。
例如,像這樣的東西可以正常工作:
val structure = StructType(
List(
StructField("RT", StringType,nullable = true),
StructField("SERIALNO", StringType,nullable = true),
StructField("SPORDER", StringType,nullable = true),
// Other Fields
StructField("LASTFIELD", StringType,nullable = true)
)
)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.