Создание таблиц Spark SQL из нескольких паркетных дорожек - PullRequest
0 голосов
/ 31 мая 2018

Я использую блоки данных.Я пытаюсь создать таблицу, как показано ниже

`       target_table_name = 'test_table_1'
        spark.sql("""
          drop table if exists %s
          """ % target_table_name)

        spark.sql("""
          create table if not exists {0}
          USING org.apache.spark.sql.parquet
          OPTIONS (
          path ("/mnt/sparktables/ds=*/name=xyz/")
          )
          """.format(target_table_name))

Несмотря на то, что использование «*» дает мне гибкость при загрузке различных файлов (сопоставление с образцом) и, в конечном итоге, при создании таблицы, я хочу создать таблицу на основе двухсовершенно разные пути (без сопоставления с образцом).

path1 = / mnt / sparktables / ds = * / name = xyz / path2 = / mnt / sparktables / new_path / name = 123fo /

Ответы [ 2 ]

0 голосов
/ 31 мая 2018

Spark использует Hive metastore для создания этих постоянных таблиц.Эти таблицы по сути являются внешними таблицами в Hive.

Обычно то, что вы пытаетесь сделать, невозможно, поскольку местоположение внешней таблицы Hive должно быть уникальным во время создания.

Однако вы все равно можете достичьтаблица кустов с другим местоположением, если вы включили стратегию разделения в своем метасольве улья.

В метастазе улья вы можете иметь разделы, которые указывают на разные местоположения.

Однако нет готового способа достичь этого.Во-первых, вам необходимо указать ключ раздела для вашего набора данных и создать таблицу из 1-го местоположения, где все данные принадлежат одному разделу.Затем измените таблицу, чтобы добавить новый раздел.

Пример:

create external table tableName(<schema>) partitioned by ('name') location '/mnt/sparktables/ds=*/name=xyz/'

Затем вы можете добавить разделы

alter table tableName add partition(name='123fo') location '/mnt/sparktables/new_path/name=123fo/'

Альтернативой этому процессу является создание 2-го кадра данныхиз 2 местоположения, объедините их, затем saveAsaTable

0 голосов
/ 31 мая 2018

Можно создать фреймы данных отдельно для двух или более файлов паркета, а затем объединить их (при условии, что они имеют одинаковые схемы)

df1.union(df2)
...