Несколько мутаций Spark DataFrame в одном канале - PullRequest
0 голосов
/ 07 ноября 2018

Рассмотрим Spark DataFrame df со следующей схемой:

root 
|-- date: timestamp (nullable = true) 
|-- customerID: string (nullable = true) 
|-- orderID: string (nullable = true) 
|-- productID: string (nullable = true)

Один столбец должен быть приведен к другому типу, другие столбцы должны просто обрезать свои пробелы.

df.select(
  $"date",
  df("customerID").cast(IntegerType),
  $"orderID",
  $"productId")
  .withColumn("orderID", trim(col("orderID")))
  .withColumn("productID", trim(col("productID")))

Операции, похоже, требуют другого синтаксиса; Приведение осуществляется через select, а trim - через withColumn. Я привык к R и dplyr, где все вышеперечисленное будет обрабатываться в одной функции mutate, поэтому смешивание select и withColumn кажется немного громоздким.

Есть ли более чистый способ сделать это в одной трубе?

Ответы [ 2 ]

0 голосов
/ 07 ноября 2018

Вы можете использовать любой из них. Разница в том, что withColumn добавит (или заменит, если используется то же имя) новый столбец в фрейм данных, в то время как select сохранит только указанные вами столбцы. В зависимости от ситуации выберите один из них.

cast можно сделать с помощью withColumn следующим образом:

df.withColumn("customerID", $"customerID".cast(IntegerType))
  .withColumn("orderID", trim($"orderID"))
  .withColumn("productID", trim($"productID"))

Обратите внимание, что вам не нужно использовать withColumn в столбце date выше.


Функции trim могут быть выполнены в select следующим образом, здесь имена столбцов остаются неизменными:

df.select(
  $"date",
  $"customerID".cast(IntegerType),
  trim($"orderID").as("orderID"),
  trim($"productId").as("productId"))
0 голосов
/ 07 ноября 2018
df.select(
  $"date",
  $"customerID".cast(IntegerType),
  trim($"orderID").as("orderID"),
  trim($"productID").as("productID"))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...