首页 > 解决方案 > 使用字节数组数组创建 Spark 数据集时出错

问题描述

我正在使用案例类和spark.sql({query}).as[MyCaseClass]语法在 scala 中创建 Spark 数据集

一切都很好,直到我尝试创建一个数据集,其中一个成员定义为Array[Array[Byte]]

case class HbaseRow(
  ip: Array[Array[Byte]]
)

val hbaseDataSet = spark
   .sql("""select ip from test_data""")
   .as[HbaseRow]

通常这可以正常工作,但是对于字节数组的数组,这会失败。

java.lang.ClassCastException: 
org.apache.spark.sql.types.BinaryType$ cannot be cast to org.apache.spark.sql.types.ObjectType
at org.apache.spark.sql.catalyst.ScalaReflection$$anonfun$org$apache$spark$sql$catalyst$ScalaReflection$$arrayClassFor$1.apply(ScalaReflection.scala:106)
at org.apache.spark.sql.catalyst.ScalaReflection$$anonfun$org$apache$spark$sql$catalyst$ScalaReflection$$arrayClassFor$1.apply(ScalaReflection.scala:95)
at scala.reflect.internal.tpe.TypeConstraints$UndoLog.undo(TypeConstraints.scala:56)

该列是 IP 地址的 spark 数组,其本身编码为字节数组。

标签: scalaapache-sparkapache-spark-sql

解决方案


好的,我在卡住时问了这个问题,但相信我已经找到了解决方案。用 Option 定义我的案例类类型似乎已经成功了。

scala> case class HbaseRow(
 |     ip: Array[Option[Array[Byte]]]
 | )
defined class HbaseRow

scala> df.select($"ip").as[HbaseRow]
res13: org.apache.spark.sql.Dataset[HbaseRow] = [ip: array<binary>]

推荐阅读