Преобразование файла объектов 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-схему, и мне нужно построить выбор, чтобы включить все возможности. Я был бы счастлив, если бы кто-то знал, что это лучший способ сделать это.