我正在使用案例类和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地址的火花数组,它们本身被编码为字节数组。
答案 0 :(得分:1)
好吧,我在遇到问题时问了这个问题,但相信我已经找到了解决方案。用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>]