繁体   English   中英

Spark SQL表最大列数

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM