Postgresql UUID []到Cassandra:转换错误

时间:2017-09-26 20:07:27

标签: scala apache-spark cassandra apache-spark-sql spark-cassandra-connector

它给了我java.lang.ClassCastException:[Ljava.util.UUID;无法转换为[Ljava.lang.String;

我的工作从包含func getPNGData(image: NSImage) -> NSData? { if let ci = image.cgImage(forProposedRect: nil, context: nil, hints: nil).map({ CIImage(cgImage: $0) }), let png = CIContext().pngRepresentation(of: ci, format: kCIFormatRGBAf, colorSpace: CGColorSpace(name: CGColorSpace.sRGB)!) { // I'm colorblind, so it's very possible that the constants above // were poorly chosen. Choose whatever makes your colors look right return png } else { return nil } } 类型列的PostgreSQL表中读取数据,以便在我尝试在Cassandra上保存数据时收到上述错误。

然而,在Cassandra上创建这个相同的表工作正常! user_ids uuid[]

我无法更改源表上的类型,因为我正在从旧系统中读取数据。

我一直在看日志上打印的点org.apache.spark.sql.execution.datasources.jdbc.JdbcUtils.scala

user_ids list<text>

Debug view

堆栈跟踪

case StringType =>
      (array: Object) =>
        array.asInstanceOf[Array[java.lang.String]]
          .map(UTF8String.fromString)```

2 个答案:

答案 0 :(得分:0)

请在此处查看CQL中的数据类型支持。

您应该在表架构中创建list<uuid>而不是list<text>。 Java驱动程序无法自动处理此转换。

如果您想使用text,请先将其转换为应用程序中的String,然后再将其发送给驱动程序。

答案 1 :(得分:0)

您在数据库中存储的user_id值是UUID类型,java中的相同类型是java.util.UUID类型。

所以不要使用java.lang.String,而应该使用java.util.UUID数组或列表,然后存储在cassandra uuid_obj.toString()中以存储在Cassandra中。