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|
+---+----------+
Решение: проблема с точкой (.). пропустить добавить, когда пункт