Я пытаюсь разорвать строку (технически строки, переданные из столбца в кадре данных) и вернуть эти разбитые строки в виде списка в массив данных. Scala версия 2.11. Я бы предпочел решения для scala или pyspark с помощью udf - потому что внутри udf происходит много всего.
Допустим, у меня есть датафрейм:
val df = List(("123", "a*b*c*d*e*f*x*y*z"), ("124", "g*h*i*j*k*l*m*n*o")).toDF("A", "B")
Результат, который я хочу (в формате udf, потому что там много чего происходит; Scala версия 2.11) -
A B
123 ((a, b, c),
(d, e, f),
(x, y, z))
124 ((g, h, i),
(j, k, l),
(m, n, o))
Напишите udf, чтобы разбить это и вернуть списки - но я не знаю, как определить или передать схему, чтобы результаты возвращались в фрейм данных в виде трех столбцов.
def testUdf = udf( (s: String) => {
val a = s.split("\\*").take(3).toList
val b = s.split("\\*").drop(3).take(3).toList
val c = s.split("\\*").drop(6).take(3).toList
val abc = (a, b, c).zipped.toList.asInstanceOf[List[String]]
// println (abc) // This does not work
} )
val df2 = df.select($"A", testUdf($"B").as("B")) // does not work because of type mismatch.
Я пытался сделать это, но я не знаю, как передать схему в Udf выше:
val schema = StructType(List(
StructField("C1", StringType),
StructField("C2", StringType),
StructField("C3", StringType)
))
Кроме того, после этого я надеюсь выполнить процедуру, описанную в Разбить несколько столбцов в таблице Spark SQL , чтобы взорвать фрейм данных.
Помощь будет принята с благодарностью.