Структурированная потоковая передача Pyspark: определите схему для массива словарей с разными ключами - PullRequest
0 голосов
/ 22 января 2020

Я создаю приложение структурированной потоковой передачи Pyspark, которое считывает данные из Kafka topi c и преобразует их в DataFrame, используя предопределенную схему json. Я столкнулся с проблемой при определении схемы, которая использует ArrayType, а именно, я хотел бы прочитать json, который состоит из массива словарей с различными ключами, как в следующем примере:

  {'A': 'Time', 'B': [{'C': '1'}, {'D': '2'}]}

Решение будет Проще быть, если массив состоит из словарей, которые следуют той же схеме, но, поскольку у нас есть здесь разные ключи, я не могу использовать следующий код:

  schema = types.StructType([
  types.StructField('A', types.StringType()),
  types.StructField('B', types.ArrayType(
  types.StructType([types.StructField('C', types.StringType())])
  ))])

ArrayType принимает только два параметра:

  :param elementType: :class:`DataType` of each element in the array.
  :param containsNull: boolean, whether the array can contain null (None) values.

Таким образом, следующее не работает:

  schema = types.StructType([
  types.StructField('A', types.StringType()),
  types.StructField('B', types.ArrayType([
  types.StructType([types.StructField('C', types.StringType())]),
  types.StructType([types.StructField('D', types.StringType())])]))])

Я пытался заменить ArrayType на StructType, но затем выдает:

  AttributeError: 'StructType' object has no attribute 'name'

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

[{'C': '1'}, {'D': '2'}, {'E': '3'}]

C | D | E
---------
1 | 2 | 3

Любой намек на то, как go достичь этой цели, будет принят.

PS. Я также могу изменить входящее сообщение кафки так, чтобы оно содержало словари только с теми же ключами. Но тогда мне нужно было бы найти какой-то способ разделить и правильно назвать все столбцы, чтобы значения из каждого сообщения go соответствовали столбцу.

[{'C': '1'}, {'C': '2'}, {'C': '3'}]
[{'C': '4'}, {'C': '5'}, {'C': '6'}]

C_1 | C_2 | C_3
---------------
1   | 2   | 3
4   | 5   | 6

Я не уверен, будет ли легко добиться этого, взорвав массив ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...