Искра при сравнении функции с целочисленным значением - PullRequest
0 голосов
/ 24 апреля 2020
def takeArray(c: Column): Column = {

      when(size(c) === lit(4), c.getItem(2)).
        when(size(c) === lit(2), c.getItem(1))
      when(size(c) === lit(0), lit(0)).otherwise(lit(-100))

    }
    df.withColumn("new_col", takeArray(col("id")))
      .select( col("id"),size(col("id")), col("new_col")).show()

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

+------------+--------+-------+
|          id|size(id)|new_col|
+------------+--------+-------+
|[1, 2, 3, 4]|       4|   -100|
|      [3, 4]|       2|   -100|
|          []|       0|      0|
+------------+--------+-------+

Обновлено:

Добавление схемы

root
 |-- id: array (nullable = false)
 |    |-- element: integer (containsNull = false)

Я получаю выше, чем выход, что неправильно. размер столбца id первой строки равен 4, и он должен совпадать с параметром first when и возвращать «2» .. но он возвращает -100. Есть идеи ? почему я получаю устный ответ?

пример 2:

import org.apache.spark.sql.Column

def lifeStage(col: Column): Column = {
  when(col < 13, "child")
    .when(col >= 13 && col <= 18, "teenager")
    .when(col > 18, "adult")
}


val df = Seq(10, 15, 25).toDF("age")

df
  .withColumn(
    "life_stage",
    lifeStage(col("age"))
  )
  .show()

+---+----------+
|age|life_stage|
+---+----------+
| 10|     child|
| 15|  teenager|
| 25|     adult|
+---+----------+

Решение: проблема с точкой (.). пропустить добавить, когда пункт

1 Ответ

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

Вам не хватает одной точки после 2-го условия. Пожалуйста, проверьте ниже код.

scala> :paste
// Entering paste mode (ctrl-D to finish)

def takeArray(c: Column): Column = {
      when(size(c) === lit(4), c.getItem(2)).
      when(size(c) === lit(2), c.getItem(1))    // here you are missing one dot, if you add dot here your code will work.
      when(size(c) === lit(0), lit(0)).otherwise(lit(-100))
}
df.withColumn("new_col", takeArray(col("id"))).select( col("id"),size(col("id")), col("new_col")).show()


// Exiting paste mode, now interpreting.

+------------+--------+-------+
|          id|size(id)|new_col|
+------------+--------+-------+
|[1, 2, 3, 4]|       4|   -100|
|      [3, 4]|       2|   -100|
|          []|       0|      0|
+------------+--------+-------+

takeArray: (c: org.apache.spark.sql.Column)org.apache.spark.sql.Column

scala> :paste
// Entering paste mode (ctrl-D to finish)

def takeArray(c: Column): Column = {
      when(size(c) === lit(4), c.getItem(2)).
      when(size(c) === lit(2), c.getItem(1)).    // here I have added . now it is showing result as expected.
      when(size(c) === lit(0), lit(0)).otherwise(lit(-100))
}
df.withColumn("new_col", takeArray(col("id"))).select( col("id"),size(col("id")), col("new_col")).show()


// Exiting paste mode, now interpreting.

+------------+--------+-------+
|          id|size(id)|new_col|
+------------+--------+-------+
|[1, 2, 3, 4]|       4|      3|
|      [3, 4]|       2|      4|
|          []|       0|      0|
+------------+--------+-------+

takeArray: (c: org.apache.spark.sql.Column)org.apache.spark.sql.Column

scala>
...