2016-12-08 5 views
0

Мне нужно выбрать элементы в глубоко вложенных структурах данных в файлах Паркета. Схема файла Паркетная выглядит следующим образом:Как выбрать вложенные массивы и карты в файле Parquet с использованием Spark SQL

root 
|-- descriptor_type: string (nullable = true) 
|-- src_date: long (nullable = true) 
|-- downloaded: long (nullable = true) 
|-- exit_nodes: array (nullable = true) 
| |-- element: struct (containsNull = true) 
| | |-- fingerprint: string (nullable = true) 
| | |-- published: long (nullable = true) 
| | |-- last_status: long (nullable = true) 
| | |-- exit_adresses: map (nullable = true) 
| | | |-- key: string 
| | | |-- value: long (valueContainsNull = true) 

Запись в наборе данных, сериализации в JSON, выглядит следующим образом:

{ 
    "descriptor_type": "tordnsel 1.0", 
    "src_date": 1472781720000, 
    "downloaded": 1472781720000, 
    "exit_nodes": [ 
    { 
     "fingerprint": "CECCFA65F3EB16CA8C0F9EAC9050C348515E26C5", 
     "published": 1472713568000, 
     "last_status": 1472716961000, 
     "exit_adresses": { 
     "178.217.187.39": 1472717419000 
     } 
    }, 
... 

Я использую Спарк 2.0, встроенный в SnappyData 0.6, в которой файл Паркет адресуется как это:

snappy> CREATE EXTERNAL TABLE stage USING PARQUET OPTIONS (path './testdata.parquet.snappy'); 

Выбор первой строки дает следующий результат:

snappy> select * from stage limit 1; 
descriptor_type|src_date   |downloaded   |exit_nodes                              
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ 
tordnsel 1.0 |1472781720000  |1472781720000  |5704000060110000e011000060120000d812000058130000d813000058140000d014000050150000d015000050160000d016000048170000c81700004018000& 

Поле 'exit_nodes' содержит только одну длинную строку, а не массив структур, на которые я наивно надеялся.
можно выбрать конкретный элемент в массиве «exit_nodes» по индексу:

snappy> select exit_nodes[0].fingerprint, exit_nodes[0].published, exit_nodes[0].exit_adresses from stage limit 1; 
EXIT_NODES[0].FINGERPRINT         |EXIT_NODES[0].PUBLISHED|EXIT_NODES[0].EXIT_ADRESSES                 
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 
3D28E5FBD0C670C004E59D6CFDE7305BC8948FA8     |1472750744000   |15000000010000000800000037382e3134322e31392e3231330100000008000000b057f0e656010000 

С картой «exit_adresses» Я не везло, хотя:

snappy> select exit_nodes[0].exit_adresses.key from stage limit 1; 
EXIT_NODES[0].EXIT_ADRESSES[KEY] 
-------------------------------- 
NULL  

Так вопросы:
- как выбрать ключи и значения на одной карте 'exit_adresses'?
- как выбрать все записи в массиве «element» или все пары «ключ-значение» в вложенной карте, чтобы импортировать их из файла Parquet в RDBMS?

ответ

0

У меня нет прямого ответа на этот вопрос, но имхо нет дальнейшей поддержки запросов вложенных типов паркетных за эту искру PR-360

Это в значительной степени охватывает все, что вы можете сделать: https://github.com/apache/spark/blob/master/sql/core/src/test/scala/org/apache/spark/sql/execution/datasources/parquet/ParquetQuerySuite.scala