Spark Scala Dataframe Преобразовать вложенные карты в один ряд Dataframe? - PullRequest
0 голосов
/ 29 апреля 2020

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

Результат должен преобразовать этот кадр данных:

+-------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
|value        |records                                                                                                                                                                        |
+-------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
|123          |[USA -> [1475600496 -> 25.000000000000000000], ITA -> [1475600500 -> 18.000000000000000000, 1475600516 -> 19.000000000000000000], JPN -> [1475600508 -> 27.000000000000000000]]|
|256          |[USA -> [1475600508 -> 40.000000000000000000, 1475600500 -> 47.000000000000000000], NOR -> [1475600496 -> 30.000000000000000000]]                                              |
|118          |[USA -> [1475600500 -> 50.000000000000000000]]                                                                                                                                 |
+-------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+

into:

+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
|valueAndRecords                                                                                                                                                                                                                                                                                                                                                                         |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
|[[123, [USA -> [1475600496 -> 25.000000000000000000], ITA -> [1475600500 -> 18.000000000000000000, 1475600516 -> 19.000000000000000000], JPN -> [1475600508 -> 27.000000000000000000]], [256, [USA -> [1475600508 -> 40.000000000000000000, 1475600500 -> 47.000000000000000000], NOR -> [1475600496 -> 30.000000000000000000]]], [118, [USA -> [1475600500 -> 50.000000000000000000]]]]|
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+

Я могу объединить оба столбца в одну структуру со строкой ниже, но она не оборачивает результаты в массив. Как это можно сделать?

df.withColumn("valueAndRecords", struct("value", "records")).select("valueAndRecords")

1 Ответ

0 голосов
/ 29 апреля 2020

Оберните struct изнутри array т.е. array(struct(...))

df.withColumn("valueAndRecords", array(struct("value", "records"))).select("valueAndRecords")

(или)

Использование collect_list:

//sample data PS I don't have all data for records column
df.show(false)
//+-----+----------------------------------------------+
//|value|records                                       |
//+-----+----------------------------------------------+
//|123  |[USA -> [1475600496 -> 25.000000000000000000]]|
//|256  |[USA -> [1475600508 -> 40.000000000000000000]]|
//|256  |[USA -> [1475600500 -> 50.000000000000000000]]|
//+-----+----------------------------------------------+

df.groupBy(lit("1")).agg(colle_list(struct("value", "records")).alias("valueAndRecords")).select("valueAndRecords").show()

//+---------------------------------------------------------------------------------------------------------------------------------------------------------------------+
//|valueAndRecords                                                                                                                                                      |
//+---------------------------------------------------------------------------------------------------------------------------------------------------------------------+
//|[[123, [USA -> [1475600496 -> 25.000000000000000000]]], [256, [USA -> [1475600508 -> 40.000000000000000000]]], [256, [USA -> [1475600500 -> 50.000000000000000000]]]]|
//+---------------------------------------------------------------------------------------------------------------------------------------------------------------------+
...