Spark Scala для подсчета длины в полях данных - PullRequest
0 голосов
/ 29 мая 2019

Впервые в Scala.

Я создал функцию подстроки в scala, которая требует "pos" и "len", я хочу, чтобы pos был жестко закодирован, однако по длине он должен считаться с фрейма данных. Как бы я поступил так?

Вот мой код:

val A = DF.select(col("example_ref"), substring(col("example_ref"),11, 21))

Заранее спасибо.

EDIT:

Итак, добавил этот код:

val A = DF.select($"example_ref",substring($"example_ref",11,length($"example_ref")))

Однако я получаю следующие ошибки:

Type Mismatch, expected: String, actual: Column
Type Mismatch, expected: Int, actual: Column

1 Ответ

0 голосов
/ 29 мая 2019

Вы можете создать UDF, чтобы получить длину столбца, а затем инкапсулировать функцию подстроки в функцию expr

val colLength = udf { (col: String) => col.size }

А затем используйте его в своем коде

val A = DF.select(col("example_ref"), expr("substring(col(example_ref),11, colLength(col(example_ref)))"))

PS. Мне больше всего нравится синтаксис доллара, чтобы получить столбцы

val A = DF.select($"example_ref", expr("substring(example_ref,11, colLength(example_ref))"))

EDIT

Как указано в комментариях, для этого уже есть функция, поэтому вам даже не нужно определять UDF:

import org.apache.spark.sql.functions.length
val A = DF.select($"example_ref", expr("substring(example_ref,11, length(example_ref))"))

БЫСТРЫЙ ПРИМЕР

ВХОД

scala> val df = sc.parallelize(List((1, "abc"),(2, "bcd"),(3, "cde"))).toDF("number", "mycolumn")
df: org.apache.spark.sql.DataFrame = [number: int, mycolumn: string]

scala> df.show
+------+--------+
|number|mycolumn|
+------+--------+
|     1|     abc|
|     2|     bcd|
|     3|     cde|
+------+--------+

OUTPUT

df.select(expr("substring(mycolumn, 2, length(mycolumn))")).show
+----------------------------------------+
|substring(mycolumn, 2, length(mycolumn))|
+----------------------------------------+
|                                      bc|
|                                      cd|
|                                      de|
+----------------------------------------+
...