我有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文件中丢失还是不丢失?