Установите все значения Нет для нескольких столбцов - PullRequest
0 голосов
/ 28 октября 2019

Я настраиваю пакет Spark, целью которого является фильтрация некоторых полей, которые необходимо очистить. Как мне установить для столбцов в значениях вопроса значение None для всех строк? (У меня уже есть фрейм данных, содержащий только строки, которые я хочу изменить)

Я далеко не эксперт в Spark, и я много раз искал, прежде чем спросить здесь, но я все еще не могу найти достаточно простой ответ.

Существует около 50 столбцов, и я не могу жестко закодировать индекс столбца для доступа к нему, поскольку он может измениться в будущих пакетах.

Пример Входной фрейм данных (целевые столбцы содержат данные):

id        TARGET 1       TARGET 2       TARGET 3     Col6     ...
someid1   Some(String)   Some(String)   Some(String) val1     ...
someid2   Some(String)   Some(String)   None         val4     ...
someid5   Some(String)   Some(String)   Some(String) val3     ...
someid6   Some(String)   Some(String)   Some(String) val7     ... 

Ожидаемый выходной кадр данных (для всех целевых столбцов установлено значение Нет):

id        TARGET 1       TARGET 2       TARGET 3     Col6     ...
someid1   None           None           None         val1     ...
someid2   None           None           None         val4     ...
someid5   None           None           None         val3     ...
someid6   None           None           None         val7     ...

1 Ответ

0 голосов
/ 28 октября 2019

AFAIK, Spark не принимает значения None. Возможным решением было бы заменить их нулевыми значениями, приведенными к String:

ds.
  .withColumn("target1", lit(null).cast(StringType))
  .withColumn("target2", lit(null).cast(StringType))

. Получается следующий вывод:

+--------------------+-------+-------+-----+
|                  id|target1|target2| col6|
+--------------------+-------+-------+-----+
| 4201735573065099460|   null|   null|疦薠紀趣餅|
|-6432819446886055080|   null|   null|┵િ塇駢뱪|
|-7700306868339925800|   null|   null|鵎썢鳝踽嬌|
|-4913818084582557950|   null|   null|ꢵ痩찢쑖|
| 6731176796531697018|   null|   null|少⽬ᩢゖ謹|
+--------------------+-------+-------+-----+
only showing top 5 rows

root
 |-- id: long (nullable = false)
 |-- target1: string (nullable = true)
 |-- target2: string (nullable = true)
 |-- col6: string (nullable = true)

Это также то, что вы получаете, когда устанавливаете значение вNone в наборе данных.

case class TestData(id: Long, target1: Option[String], target2: Option[String], col6: String)

val res = Seq(
  TestData(1, Some("a"), Some("b"), "c"),
  TestData(2, Some("a"), Some("b"), "c"),
  TestData(3, Some("a"), Some("b"), "c"),
  TestData(4, Some("a"), Some("b"), "c")
).toDS()

res.show(5)
res.map(_.copy(target1 = None, target2 = None)).show(5)
res.printSchema()

Возвращает:

+---+-------+-------+----+
| id|target1|target2|col6|
+---+-------+-------+----+
|  1|      a|      b|   c|
|  2|      a|      b|   c|
|  3|      a|      b|   c|
|  4|      a|      b|   c|
+---+-------+-------+----+

+---+-------+-------+----+
| id|target1|target2|col6|
+---+-------+-------+----+
|  1|   null|   null|   c|
|  2|   null|   null|   c|
|  3|   null|   null|   c|
|  4|   null|   null|   c|
+---+-------+-------+----+

root
 |-- id: long (nullable = false)
 |-- target1: string (nullable = true)
 |-- target2: string (nullable = true)
 |-- col6: string (nullable = true)

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