+---------------------------+
|address |
+---------------------------+
|[San Jone, 19422, CA, 126]|
|[Queens, 11372, NY, 5543] |
+---------------------------+
Как разделить один столбец на 4, если значение внутри находится в массиве?
Ожидаемый результат:
+-----------------------------+
|city | Zip |state|street |
+-----------------------------+
|San Jose| 19422| CA |126 |
|Queens | 11372| NY |5543 |
+-----------------------------+
Обновлено:
[
{
"firstName": "Rack",
"lastName": "Jackon",
"gender": "man",
"age": 24,
"address": {
"streetAddress": "126",
"city": "San Jone",
"state": "CA",
"postalCode": "394221"
}
},
{
"firstName": "Apache",
"lastName": "Spark",
"gender": "Woman",
"age": 24,
"address": {
"streetAddress": "5543",
"city": "Queens",
"state": "NY",
"postalCode": "11372"
}
}
]
Это файл .json, который у меня есть. После создания кадра данных мне нужно разделить адрес на 4 столбца.
вы упомянули, что адрес представляет собой массив, но выглядит как тип структуры. вы можете использовать address.*
, он создаст новые столбцы в соответствии с вашими требованиями.
Попробуйте код ниже.
scala> df.show(false)
+--------------------------+
|address |
+--------------------------+
|[San Jone, 19422, CA, 126]|
|[Queens, 11372, NY, 5543] |
+--------------------------+
scala> val columns = Seq("city","zip","state","street").zipWithIndex
scala> df.select(columns.map(c => col(s"address")(c._2).as(c._1)):_*).show(false)
+--------+-----+-----+------+
|city |zip |state|street|
+--------+-----+-----+------+
|San Jone|19422|CA |126 |
|Queens |11372|NY |5543 |
+--------+-----+-----+------+
Это дало эту ошибку: AnalysisException: имя поля должно быть строковым литералом, но оно равно 0;
val columns = Seq("город","zip","штат","улица").zipWithIndex test.select(columns.map(c => col(s"address")(c._2).as(c ._1)):_*).показать
Я отредактировал вопрос, если он делает его более понятным. Пожалуйста, ответьте, если можете. Спасибо.
я использую блоки данных, я думаю, что это искра 3.0