Объединить несколько записей в кадре данных на основе ключа в Scala Spark - PullRequest
0 голосов
/ 07 мая 2018

У меня есть датафрейм, который содержит записи, идентифицированные ключом.Но может быть случай, когда ключ может стать повторяющимся.Моя цель состоит в том, чтобы объединить все записи, основанные на этом ключе, следующим образом

Предположим, что мой входной фрейм данных выглядит примерно так:

key | value1 | value2 | value3
-------------------------------
a   | 1      | null   | null
a   | null   | 2      | null
a   | null   | null   | 3

и я хочу, чтобы мои выходные данные после объединения основывались на 'a'должно выглядеть примерно так:

key | value1 | value2 | value3
-------------------------------
a   | 1      | 2      | 3

Теперь я уверен, что в этой части либо одно из трех значений будет присутствовать против одной записи для ключа' a '.

Спасибо

1 Ответ

0 голосов
/ 07 мая 2018

Если вы знаете, что для группы есть только одна запись, которая не равна нулю (или вам все равно, какую именно вы получите), вы можете использовать first:

import org.apache.spark.sql.functions.{first, last}

val df = Seq(
  ("a", Some(1), None, None), ("a", None, Some(2), None),
  ("a", None, None, Some(3))
).toDF("key", "value1", "value2", "value3")

df.groupBy("key").agg(
  first("value1", true) as "value1", 
  first("value2", true) as "value2", 
  first("value3", true) as "value3"
).show  

// +---+------+------+------+
// |key|value1|value2|value3|
// +---+------+------+------+
// |  a|     1|     2|     3|
// +---+------+------+------+

или last:

df.groupBy("key").agg(
  last("value1", true) as "value1", 
  last("value2", true) as "value2", 
  last("value3", true) as "value3"
).show  


// +---+------+------+------+
// |key|value1|value2|value3|
// +---+------+------+------+
// |  a|     1|     2|     3|
// +---+------+------+------+    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...