Это схема созданного Spark DataFrame:
root
|-- id: double (nullable = true)
|-- sim_scores: struct (nullable = true)
| |-- scores: map (nullable = true)
| | |-- key: string
| | |-- value: map (valueContainsNull = true)
| | | |-- key: integer
| | | |-- value: vector (valueContainsNull = true)
Структура 'sim_scores' представляет класс-случай Scala, который я использую для целей агрегирования.У меня есть обычай UDAF, предназначенный для объединения этих структур.Чтобы сделать их безопасными для слияния для всех крайних случаев, они выглядят так, как они.Предположим, что для этого вопроса они должны оставаться такими.
Я хотел бы «сплющить» этот DataFrame во что-то вроде:
root
|-- id: double (nullable = true)
|-- score_1: map (valueContainsNull = true)
| |-- key: integer
| |-- value: vector (valueContainsNull = true)
|-- score_2: map (valueContainsNull = true)
| |-- key: integer
| |-- value: vector (valueContainsNull = true)
|-- score_3: map (valueContainsNull = true)
| |-- key: integer
| |-- value: vector (valueContainsNull = true)
...
Внешний MapType в структуре 'Scores'сопоставляет баллы тем с документами;внутренние карты, представляющие документ, отображают положение предложения в документе на векторную оценку.«Score_1», «Score_2», ... представляют все возможные ключи MapType «Scores» в начальном DF.
В терминах json-ish, если бы у меня был ввод, который выглядит следующим образом:
{ "id": 739874.0,
"sim_scores": {
"firstTopicName": {
1: [1,9,1,0,1,1,4,6],
2: [5,7,8,2,4,3,1,3],
...
},
"anotherTopic": {
1: [6,8,4,1,3,4,2,0],
2: [0,1,3,2,4,5,6,2],
...
}
}
}
тогда я получу вывод
{ "id": 739874.0,
"firstTopicName": {
1: [1,9,1,0,1,1,4,6],
2: [5,7,8,2,4,3,1,3],
...
}
"anotherTopic": {
1: [6,8,4,1,3,4,2,0],
2: [0,1,3,2,4,5,6,2],
...
}
}
Если бы я знал общее количество столбцов темы, это было бы легко;но я не.Количество тем задается пользователем во время выполнения, выходной DataFrame имеет переменное количество столбцов.Это гарантированно будет> = 1, но мне нужно спроектировать это так, чтобы он мог работать со 100 различными столбцами темы, если это необходимо.
Как я могу реализовать это?
Последнее примечание:Я застрял с использованием Spark 1.6.3;поэтому решения, которые работают с этой версией, являются лучшими.Однако я возьму любой способ сделать это в надежде на дальнейшую реализацию.