Apache Spark以Parquet格式导出PostgreSQL数据

时间:2018-11-05 19:38:56

标签: postgresql apache-spark parquet

我有PostgreSQL数据库,其中有约1000个不同的表。我想将所有这些表和其中的数据导出到Parquet文件中。

为了做到这一点,我将每个表读入DataFrame,然后将此df存储到Parquet文件中。许多PostgreSQL表都包含用户定义的类型。

最大的问题是-我无法手动指定DataFrame的架构。在这种情况下,Apache Spark是否能够自动推断PostgreSQL表模式并将它们适当地存储为Parquet格式,或者使用Apache Spark是不可能的,并且为此必须使用其他技术?

已更新

我创建了以下PostgreSQL用户定义的类型,表和记录:

create type dimensions as (
  width integer,
  height integer,
  depth integer
);

create table moving_boxes (
  id serial primary key,
  dims dimensions not null
);

insert into moving_boxes (dims) values (row(3,4,5)::dimensions);
insert into moving_boxes (dims) values (row(1,4,2)::dimensions);
insert into moving_boxes (dims) values (row(10,12,777)::dimensions);

实现了以下Spark应用程序:

// that gives an one-partition Dataset
val opts = Map(
  "url" -> "jdbc:postgresql:sparktest",
  "dbtable" -> "moving_boxes",
  "user" -> "user",
  "password" -> "password")

val df = spark.
  read.
  format("jdbc").
  options(opts).
  load

println(df.printSchema())

df.write.mode(SaveMode.Overwrite).format("parquet").save("moving_boxes.parquet")

这是df.printSchema的输出:

root
 |-- id: integer (nullable = true)
 |-- dims: string (nullable = true)

您可能会看到,Spark DataFrame推断模式为string而不是复杂的嵌套类型。

这是来自ParquetWriteSupport的日志信息:

18/11/06 10:08:52 INFO ParquetWriteSupport: Initialized Parquet WriteSupport with Catalyst schema:
{
  "type" : "struct",
  "fields" : [ {
    "name" : "id",
    "type" : "integer",
    "nullable" : true,
    "metadata" : { }
  }, {
    "name" : "dims",
    "type" : "string",
    "nullable" : true,
    "metadata" : { }
  } ]
}
and corresponding Parquet message type:
message spark_schema {
  optional int32 id;
  optional binary dims (UTF8);
}

请您解释一下,原始复数dims类型(在PostgreSQL中定义)会在保存的Parquet文件中丢失还是不丢失?

0 个答案:

没有答案