在 org.apache.spark.sql.types.DataTypes 中找不到 uuid

Ven*_*enu 6 uuid

我们有一个 PostgreSQL 表,其中 UUID 作为列之一。我们如何将 Spark 数据集中的 UUID 字段(使用 Java)发送到 PostgreSQL DB。我们无法在 org.apache.spark.sql.types.DataTypes 中找到 uuid 字段。

请指教。

eco*_*coe 6

正如已经指出的那样,尽管解决了这些问题(101865753),但从uuidSpark 2.3.0 开始,仍然不支持Postgres 数据类型。

但是,有一种解决方法是使用 SparkSaveMode.Append并设置Postgres JDBC 属性以允许推断字符串类型。简而言之,它的工作原理如下:

    val props = Map(
          JDBCOptions.JDBC_DRIVER_CLASS -> "org.postgresql.Driver",
          "url" -> url,
          "user" -> user,
          "stringtype" -> "unspecified"
        )
          
    yourData.write.mode(SaveMode.Append)
        .format("jdbc")
        .options(props)
        .option("dbtable", tableName)
        .save()
Run Code Online (Sandbox Code Playgroud)

该表应使用已用 type 定义的 uuid 列创建uuid。但是,如果您尝试让 Spark 2.3.0 创建此表,您将再次碰壁:

    yourData.write.mode(SaveMode.Overwrite)
        .format("jdbc")
        .options(props)
        .option("dbtable", tableName)
        .option("createTableColumnTypes", "some_uuid_column_name uuid")
        .save()
Run Code Online (Sandbox Code Playgroud)

结果:

不支持数据类型 uuid。(第 1 行,位置 21)


小智 2

是的,你没看错,SparkSQL 中没有 UUID 数据类型。将它们视为字符串应该可行,因为连接器会将字符串转换为 UUID。

我还没有尝试过 PostgreSQL,但是当我使用 Cassandra(和 Scala)时,它工作得很好。

  • 感谢你的快速回复。但是,当我作为字符串发送时,出现错误: org.postgresql.util.PSQLException: ERROR: column "myColumnName" is of type uuid but expression is of type charactervariable (4认同)
  • org.postgresql.util.PSQLException:错误:列“cashed_UUID”的类型为uuid,但表达式的类型为字符变化提示:您将需要重写或转换表达式。 (2认同)