Не дозаписываются данные в таблицу, в apache spark

Есть данные следующего вида:

``` [ {'count': 309,
  'next': 'some_url',
  'previous': None,
  'results': [{'assigned_to': 44,
    'category': 'Unused',
    'comments': None,
    'completed_ts': None,
    'created': '2019-05-27T05:14:22.306843Z',
    'description': 'Pollution',
    'display_name': {'admin': False,
     'business_name': 'Test Business',
     'contact_number': 'some_number',
     'dob': None,
     'email': 'some_mail',
     'emp_id': None,
     'first_name': 'Ali'}}]},......}] ```

Данные, по API, парсятся ежедневно и необходимо их записывать в паркет и добавлять в таблицу. Причем в разные дни структура json может отличаться. Если записывать таким образом, то все отрабатывает успешно

```df = self.spark.read.option('multiline', 'true') \
            .json(self.spark.sparkContext.parallelize(([json.dumps(data)])))
   df.write.saveAsTable(f'{self.database}.{self.entity}',
                             path=self.save_path,
                             mode='overwrite',
                             format='parquet')
```

Но каждый раз делать overwrite не представляется возможным, но если попытаться добавить данные, т.е. сделать mode='append', то будет ошибка что не подходит схема для json

Пример ошибки: Пример ошибки


Ответы (1 шт):

Автор решения: Alex Chermenin

Если кратко, то схема может быть примерно следующая:

  1. Получаем данные из API и записываем во временный parquet-файл.

  2. Читаем данные одновременно из целевого parquet-файла и временного с использованием опции mergeSchema.

    df = spark.read.option("mergeSchema", "true").parquet(data_path)
    
  3. Записываем всё, что получилось, на место целевого parquet-файла.

→ Ссылка