Позвольте мне объяснить это на примере. Начиная со следующего кадра данных
val df = Seq((1, "CS", 0, Array(0.1, 0.2, 0.4, 0.5)),
(4, "Ed", 0, Array(0.4, 0.8, 0.3, 0.6)),
(7, "CS", 0, Array(0.2, 0.5, 0.4, 0.7)),
(101, "CS", 1, Array(0.5, 0.7, 0.3, 0.8)),
(5, "CS", 1, Array(0.4, 0.2, 0.6, 0.9))).toDF("id", "dept", "test", "array")
df.show()
+---+----+----+--------------------+
| id|dept|test| array|
+---+----+----+--------------------+
| 1| CS| 0|[0.1, 0.2, 0.4, 0.5]|
| 4| Ed| 0|[0.4, 0.8, 0.3, 0.6]|
| 7| CS| 0|[0.2, 0.5, 0.4, 0.7]|
|101| CS| 1|[0.5, 0.7, 0.3, 0.8]|
| 5| CS| 1|[0.4, 0.2, 0.6, 0.9]|
+---+----+----+--------------------+
Рассматривая в качестве примера следующие две общие операции (но не ограничиваясь ими):
import org.apache.spark.sql.functions._ // for `when`
val dfFilter1 = df.where($"dept" === "CS")
val dfFilter3 = df.withColumn("category", when($"dept" === "CS" && $"id" === 101, 10).otherwise(0))
Теперь у меня есть строковая переменная colName = "dept". И требуется, чтобы $ "dept" в предыдущей операции был заменен на colName в некоторой форме для достижения той же функциональности. Мне удалось добиться первого, как показано ниже:
val dfFilter2 = df.where(s"${colName} = 'CS'")
Но подобная операция завершается неудачно во втором случае:
val dfFilter4 = df.withColumn("category", when(s"${colName} = 'CS'" && $"id" === 101, 10).otherwise(0))
В частности, это дает следующую ошибку:
Name: Unknown Error
Message: <console>:35: error: value && is not a member of String
val dfFilter4 = df.withColumn("category", when(s"${colName} = 'CS'" && $"id" === 101, 10).otherwise(0))
Насколько я понимаю, после того, как я использую s "$ {variable}" для работы с переменной, все становится чистой строкой, и трудно задействовать логическую операцию.
Итак, мой вопрос:
1. Как лучше всего использовать такую строковую переменную, как colName, для операций, подобных тем, что я перечислил выше (мне также не нравится решение, которое у меня есть для .where ())?
2. Существуют ли общие рекомендации по использованию такой строковой переменной в более общих операциях, кроме двух приведенных здесь примеров (я всегда чувствовал, что она очень специфична для конкретного случая, когда я имею дело со связанными со строками операциями).