Spark SQL table 最大列数
Spark SQL table max column count
我正在尝试通过在列数超过 200 的 Scala 程序中创建 RDD 来创建 spark SQL table。当我将模式创建为:
时,编译(sbt 编译)失败并出现 java.lang.WhosebugError 异常
StructField("RT", StringType,nullable = true) ::
StructField("SERIALNO", StringType,nullable = true) ::
StructField("SPORDER", StringType,nullable = true) ::
// ... remaining 200+ columns
无法粘贴堆栈跟踪,因为它超过 1.5k 行
将列数减少到 100-120 左右编译成功。此外,当我使用模式字符串(拆分模式字符串然后创建它的映射)创建模式时,编译成功([=13= 中标题“以编程方式指定模式”标题下的第一个示例]).
手动指定导致异常的模式似乎有什么问题?
这里的基本问题是您要在每个 StructField 的每个步骤中进行列表串联。 operator :: 实际上是 List 而不是 StructField 的成员。代码为:
val fields = field1 :: field2 :: field3 :: Nil
这相当于:
val fields = field1 :: (field2 :: (field3 :: Nil))
甚至
val fields = Nil.::(field1).::(field2).::(field3)
因此,在执行时,JVM 需要递归评估对 ::
方法的调用。 JVM 正在根据列表中的项目数按比例增加堆栈的深度。拆分一串字段名称和映射之所以有效,是因为它遍历拆分的字段名称字符串,而不是使用递归。
这不是 Spark 问题。一旦进入数百个项目,您就可以在 Scala repl 中的一系列任何类型的列表串联上重现相同的堆栈溢出错误。只需使用其他方法之一来创建不会导致堆栈溢出的 StructFields 列表。
例如,像这样的东西就可以正常工作:
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)
)
)
我正在尝试通过在列数超过 200 的 Scala 程序中创建 RDD 来创建 spark SQL table。当我将模式创建为:
时,编译(sbt 编译)失败并出现 java.lang.WhosebugError 异常StructField("RT", StringType,nullable = true) ::
StructField("SERIALNO", StringType,nullable = true) ::
StructField("SPORDER", StringType,nullable = true) ::
// ... remaining 200+ columns
无法粘贴堆栈跟踪,因为它超过 1.5k 行
将列数减少到 100-120 左右编译成功。此外,当我使用模式字符串(拆分模式字符串然后创建它的映射)创建模式时,编译成功([=13= 中标题“以编程方式指定模式”标题下的第一个示例]).
手动指定导致异常的模式似乎有什么问题?
这里的基本问题是您要在每个 StructField 的每个步骤中进行列表串联。 operator :: 实际上是 List 而不是 StructField 的成员。代码为:
val fields = field1 :: field2 :: field3 :: Nil
这相当于:
val fields = field1 :: (field2 :: (field3 :: Nil))
甚至
val fields = Nil.::(field1).::(field2).::(field3)
因此,在执行时,JVM 需要递归评估对 ::
方法的调用。 JVM 正在根据列表中的项目数按比例增加堆栈的深度。拆分一串字段名称和映射之所以有效,是因为它遍历拆分的字段名称字符串,而不是使用递归。
这不是 Spark 问题。一旦进入数百个项目,您就可以在 Scala repl 中的一系列任何类型的列表串联上重现相同的堆栈溢出错误。只需使用其他方法之一来创建不会导致堆栈溢出的 StructFields 列表。
例如,像这样的东西就可以正常工作:
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)
)
)