SparkSQL разбивает строку при первом появлении строки - PullRequest
0 голосов
/ 07 мая 2019

У меня есть столбец String с именем field в фрейме данных Spark, который выглядит следующим образом:

my_field_name: abc_def_ghi

Я хочу снять часть my_field_name и просто оставить значение. Обычно я использовал бы udf и использовал функции подстроки, но мне было интересно, есть ли способ сделать это, используя функции SparkSQL, чтобы я не брал дополнительный SerDe при сериализации udf. Вот моя попытка:

.withColumn("fieldVals", split(substring($"field", instr($"field", "?"), len($"field")), ""))

Проблема в том, что split ожидает Int, а вместо этого я даю ему Int Column. Есть ли способ обойти это?

1 Ответ

1 голос
/ 07 мая 2019

Используя regexp_extract:

val df = Seq("my_field_name:abc_def_ghi").toDF("field")
df.select(regexp_extract($"field", ":(.*)", 1) as "col").show()

Выход:

+-----------+
|        col|
+-----------+
|abc_def_ghi|
+-----------+

Или альтернативно используя substring_index

df.select(substring_index($"field", ":", -1) as "col").show()

или split:

df.select(split($"field", ":").getItem(1) as "col").show()
...