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

Posted

技术标签:

【中文标题】在 org.apache.spark.sql.types.DataTypes 中找不到 uuid【英文标题】:Cant find uuid in org.apache.spark.sql.types.DataTypes 【发布时间】:2017-11-18 17:24:31 【问题描述】:

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

请指教。

【问题讨论】:

你是怎么解决的@Venu 【参考方案1】:

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

但是,there's a workaround 通过使用 Spark 的 SaveMode.Append 并设置 Postgres JDBC property to allow string types to be inferred。简而言之,它的工作原理如下:

    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()

应该使用已使用类型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()

结果:

不支持数据类型 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 character varying org.postgresql.util.PSQLException: ERROR: column "cashed_UUID" is of type uuid but expression is of type character varying 提示:您需要重写或转换表达式。 我在尝试这个解决方案时遇到了同样的错误。 @Venu 你是怎么解决的;我们也遇到了同样的错误org.postgresql.util.PSQLException: ERROR: column "myColumnName" is of type uuid but expression is of type character varying。请帮助我们提供示例代码

以上是关于在 org.apache.spark.sql.types.DataTypes 中找不到 uuid的主要内容,如果未能解决你的问题,请参考以下文章

秋的潇洒在啥?在啥在啥?

上传的数据在云端的怎么查看,保存在啥位置?

在 React 应用程序中在哪里转换数据 - 在 Express 中还是在前端使用 React?

存储在 plist 中的数据在模拟器中有效,但在设备中无效

如何在保存在 Mongoose (ExpressJS) 之前在模型中格式化数据

如何在保存在 Mongoose (ExpressJS) 之前在模型中格式化数据