Ниже приведен простой синтаксис для поиска строки в определенном столбце с использованием функциональности SQL Like.
val dfx = df.filter($"name".like(s"%${productName}%"))
Вопрос в том, как мне взять каждый столбец ИМЯ , который содержал конкретную строку в его ЗНАЧЕНИЯХ, и создать новый столбец со списком этих "имен столбцов" для каждой строки.
До сих пор я использовал этот подход, но застрял, поскольку не могу использовать spark-sql функцию "Like" внутри UDF.
import org.apache.spark.sql.functions._
import org.apache.spark.sql.DataFrame
import org.apache.spark.sql.types._
import spark.implicits._
val df1 = Seq(
(0, "mango", "man", "dit"),
(1, "i-man", "man2", "mane"),
(2, "iman", "mango", "ho"),
(3, "dim", "kim", "sim")
).toDF("id", "col1", "col2", "col3")
val df2 = df1.columns.foldLeft(df1) {
(acc: DataFrame, colName: String) =>
acc.withColumn(colName, concat(lit(colName + "="), col(colName)))
}
val df3 = df2.withColumn("merged_cols", split(concat_ws("X", df2.columns.map(c=> col(c)):_*), "X"))
Вот пример вывода. Обратите внимание , что здесь есть только 3 столбца, но в реальной работе я буду читать несколько таблиц, которые могут содержать динамическое количество столбцов.
+--------------------------------------------+
|id | col1| col2| col3| merged_cols
+--------------------------------------------+
0 | mango| man | dit | col1, col2
1 | i-man| man2 | mane | col1, col2, col3
2 | iman | mango| ho | col1, col2
3 | dim | kim | sim|
+--------------------------------------------+