Как взорвать поле массива данных Spark с уникальными идентификаторами в Scala? - PullRequest
0 голосов
/ 21 сентября 2018

У меня есть следующий кадр данных:

+-----------+
|        f1 |
+-----------+
|[a,b,c]    |
|[e,f,g]    |
|[h,i]      |
+-----------+

Я хочу разбить его на строки вместе с повторяющимся полем уникального номера следующим образом:

+-----------+--------+
|        f1 |     uid|
+-----------+--------+
|a          |       1|
|b          |       1|
|c          |       1|
|e          |       2|
|f          |       2|
|g          |       2|
|h          |       3|
|i          |       3|
+-----------+--------+

Я могу выполнить разнесение напрямуюкак объяснено здесь - Spark: развернуть массив структур данных и добавить идентификатор

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

1 Ответ

0 голосов
/ 21 сентября 2018

Правильный способ сделать это - использовать monotonically_increasing_id

val df = Seq(Seq("a", "b", "c"), Seq("e", "f", "g"), Seq("h", "i")).toDF("f1")

df
  .withColumn("uid", monotonically_increasing_id)
  .withColumn("f1", explode($"f1"))
  .show
// +---+---+                                                                       
// | f1|uid|
// +---+---+
// |  a|  0|
// |  b|  0|
// |  c|  0|
// |  e|  1|
// |  f|  1|
// |  g|  1|
// |  h|  2|
// |  i|  2|
// +---+---+

Число не обязательно должно быть последовательным, как в примере, но будет однозначно идентифицировать источник.

Не использовать rank().over(Window.orderBy("f1")).Он по своей сути последовательный и не масштабируемый, и его следует избегать, за исключением локального Datasets (то есть того, который возвращает true из isLocal).

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