Преобразование файла объектов JSON в файл Parquet

Мотивация: я хочу загрузить данные в сверло Apache. Я понимаю, что Drill может обрабатывать вход JSON, но я хочу посмотреть, как он работает с данными Parquet.

Есть ли способ сделать это без предварительной загрузки данных в Hive и т.д., А затем с помощью одного из соединителей Parquet для создания выходного файла?

Ответы

Ответ 1

Kite поддерживает импорт JSON в форматы Avro и Parquet через утилиту командной строки, kite-dataset.

Во-первых, вы вывели бы схему своего JSON:

kite-dataset json-schema sample-file.json -o schema.avsc

Затем вы можете использовать этот файл для создания таблицы паркета:

kite-dataset create mytable --schema schema.avsc --format parquet

И, наконец, вы можете загрузить JSON в набор данных.

kite-dataset json-import sample-file.json mytable

Вы также можете импортировать целые файлы, хранящиеся непосредственно в HDFS. В этом случае Kite будет использовать задание MR для импорта.

Ответ 2

Фактически вы можете использовать Drill для создания файла паркета из результата любого запроса.

create table student_parquet as select * from 'student.json';

Вышеприведенная строка должна быть достаточно хорошей. Drill интерпретирует типы, основанные на данных в полях. Вы можете заменить свой собственный запрос и создать файл паркета.

Ответ 3

Чтобы выполнить ответ @rahul, вы можете использовать упражнение для этого - но мне нужно было добавить еще больше к запросу, чтобы он работал из коробки с помощью сверла.

create table dfs.tmp.'filename.parquet' as select * from dfs.'/tmp/filename.json' t

Мне нужно было предоставить ему плагин для хранения (dfs), а "корневая" конфигурация может считываться со всего диска и не доступна для записи. Но tmp config (dfs.tmp) доступен для записи и записывается в /tmp. Поэтому я написал там.

Но проблема в том, что если json вложен или, возможно, содержит необычные символы, я получаю загадочную

org.apache.drill.common.exceptions.UserRemoteException: SYSTEM ERROR: java.lang.IndexOutOfBoundsException:

Если у меня есть структура, которая выглядит как members: {id:123, name:"joe"} Мне нужно будет изменить выбор на

select members.id as members_id, members.name as members_name

или

select members.id as 'members.id', members.name as 'members.name'

чтобы заставить его работать.

Я предполагаю, что причиной является то, что паркет является хранилищем "столбцов", поэтому вам нужны столбцы. JSON не по умолчанию, поэтому вам нужно его преобразовать.

Проблема в том, что я должен знать мою json-схему, и мне нужно построить выбор, чтобы включить все возможности. Я был бы счастлив, если бы кто-то знал, что это лучший способ сделать это.