Apache Spark экспортирует данные PostgreSQL в формате Parquet - PullRequest
0 голосов
/ 05 ноября 2018

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

...