Подстрока с разделителями Spark Scala - PullRequest
0 голосов
/ 23 декабря 2018

Я новичок в Spark и Scala и хочу задать вам вопрос:

У меня есть поле города в моей базе данных (которое я уже загрузил в DataFrame) с этим шаблоном: "someLetters" + " - " + id + ')'.
Пример:

ABDCJ - 123456)   
AGDFHBAZPF - 1234567890)

Размер поля не фиксирован, и id здесь может быть целым числом от 6 до 10 цифр.Итак, что я хочу сделать, это извлечь это id в новый столбец с именем city_id.
Конкретно, я хочу начать с последнего символа цифры ')', игнорировать его и извлечьцелое число, пока я не найду пробел.Затем перерыв.

Я уже пытался сделать это, используя withColumn или regex или даже subString index, но я запутался, поскольку они основаны на индексе, который я не могу использовать здесь.

Как я могу это исправить?

Ответы [ 5 ]

0 голосов
/ 24 декабря 2018

Вы также можете использовать 2 функции regexp_replace.

scala> val df = Seq(("ABDCJ - 123456)"),("AGDFHBAZPF - 1234567890)")).toDF("cityid")
df: org.apache.spark.sql.DataFrame = [citiid: string]

scala> df.withColumn("id",regexp_replace(regexp_replace('cityid,""".*- """,""),"""\)""","")).show(false)
+------------------------+----------+
|cityid                  |id        |
+------------------------+----------+
|ABDCJ - 123456)         |123456    |
|AGDFHBAZPF - 1234567890)|1234567890|
+------------------------+----------+


scala>

Поскольку идентификатор выглядит как целое число, вы можете привести его к длине до

scala> val df2 = df.withColumn("id",regexp_replace(regexp_replace('cityid,""".*- """,""),"""\)""","").cast("long"))
df2: org.apache.spark.sql.DataFrame = [cityid: string, id: bigint]

scala> df2.show(false)
+------------------------+----------+
|cityid                  |id        |
+------------------------+----------+
|ABDCJ - 123456)         |123456    |
|AGDFHBAZPF - 1234567890)|1234567890|
+------------------------+----------+


scala> df2.printSchema
root
 |-- cityid: string (nullable = true)
 |-- id: long (nullable = true)


scala>
0 голосов
/ 23 декабря 2018

Я бы выбрал regex_extract, но есть много альтернатив: вы также можете сделать это, используя 2 разбиения:

df
.withColumn("id",
  split(
    split($"city"," - ")(1),"\\)"
  )(0) 
)

Сначала вы делите на - и берете второй элемент, затем делите на) и возьмите первый элемент

Или другой вариант, разделите на - и затем отбросьте ):

df
.withColumn("id",
   reverse(
     substring(         
       reverse(split($"city"," - ")(1)),
       2,
       Int.MaxValue
     )
   )
)
0 голосов
/ 23 декабря 2018

Предполагая, что входные данные имеют формат в вашем примере.
Чтобы получить число после - без завершающего ), вы можете выполнить следующую команду:

split(" - ")(1).dropRight(1)

Выше разделить на знак - и взять второй элемент (то есть число), и удалить последний символ ()).

Вы можете создать udf, который выполняет вышеуказанную командуи создайте новый столбец, используя команду withColumn

0 голосов
/ 23 декабря 2018

enter image description here

import org.apache.spark.sql.functions._
val df=tempDF.withColumn("city_id",rtrim(element_at(split($"city"," - "),2),")"))
0 голосов
/ 23 декабря 2018

начинайте с последнего символа цифры, который равен ')', игнорируйте его и извлекайте целое число, пока я не найду пробел

Это можно сделать с помощью регулярного выражения .*?(\\d+)\\)$где \\)$ соответствует ) в конце строки, а затем захватывает цифры с помощью \\d+ и извлекает его как новый столбец;Обратите внимание, .*? лениво (из-за ?) соответствует строке, пока не будет найден шаблон (\\d+)\\)$:

df.withColumn("id", regexp_extract($"city", ".*?(\\d+)\\)$", 1)).show
+--------------------+----------+
|                city|        id|
+--------------------+----------+
|     ABDCJ - 123456)|    123456|
|AGDFHBAZPF - 1234...|1234567890|
+--------------------+----------+
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...