从postgreSQL读取100M行到Spark并写入镶木地板

时间:2017-08-10 12:07:11

标签: postgresql scala apache-spark jdbc spark-dataframe

我正在尝试阅读一个大表来激发(~100M行)。该表位于PostGreSQL中,我们阅读如下:

val connectionProperties = new Properties()
connectionProperties.put("user", "$USER")
connectionProperties.put("password", "$PASSWORD")

// val connection = DriverManager.getConnection("$SERVER", "$USER", "$PASSWORD")
//connection.isClosed()

val jdbc_url = s"jdbc:postgresql://${"$HOST"}:${$PORT}/${"$DB"}"
val df = spark.read.option("inferSchema", true).jdbc(jdbc_url, "$TABLE", connectionProperties)

但我们的SQL表有2列作为money数据类型(格式为$ 100,000.23)。当读入spark时,它会转换为double并抛出异常。

我们尝试过:    a)将列数据转换为Double。但这并没有帮助,因为Spark也会自动加倍。在价值观方面存在问题。 (用过的    b)数据已经在逗号的DataFrame中。试图使用PostgreSQL方言(https://github.com/apache/spark/blob/master/sql/core/src/main/scala/org/apache/spark/sql/jdbc/PostgresDialect.scala

任何帮助都将非常感激。

1 个答案:

答案 0 :(得分:2)

您可以尝试手动指定架构,将列作为字符串读取,然后手动解析定义用户定义函数的值。

要手动指定架构,您需要编写类似这样的内容

    val schema =
  StructType(
    StructField("your-example-column1", IntegerType, true) ::
    StructField("your-money-column", StringType, true) :: Nil)
    spark.read.schema(schema)

请参阅Spark Scala API:

要详细了解如何将StringType转换为数据类型,请参阅此question