У меня есть база данных 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 или нет?