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