Regex, чтобы лишить трейлинг 0, но сохранить значение к определенной длине - PullRequest
0 голосов
/ 05 июня 2018

Мне нужно убрать значения конечных нулей, но также нужно сохранить конечную длину значений равной 4.

+--------+
|codes   |
+--------+
|  541100|
|  54100 |
|  05810 |
|  581200|
|  58140 |
|  54110 |
|  48140 |
|  481400|
|  723000 |
|  52000 |
+--------+

нижняя строка обрезает все конечные нули, как мне убедиться, чтоон поддерживает длину 4.

df.withColumn("strip_codes", regexp_replace(col("codes"), "^([0]+(?!$))|0*$", ""))

также, я хочу игнорировать значение 05810, чтобы соответствовать регулярному выражению для конечных нулей o / p DF

+--------+
|strip_codes   |
+--------
|  5411|
|  5410|
|  05810|
|  5812|
|  5814|
|  5411|
|  4814|
|  4814|
|  7230|
|  5200|
+--------+

какие изменения делаютмне нужно сделать в существующем регулярном выражении.

Ответы [ 2 ]

0 голосов
/ 05 июня 2018

Следующий фрагмент кода аннулирует коды длиной> 6, оставляя коды, соответствующие специальному списку, без изменений;в остальном, шаблон regex удалит все начальные нули, сохранит 4 из следующих цифр и обрежет все оставшиеся конечные нули:

import org.apache.spark.sql.functions._

val df = Seq(
  "541100", "54110", "05810", "581200", "58140", 
  "54110", "48140", "481400", "723000", "52000",
  "0742", "0763", "001234", "123", "1234560"
).toDF("codes")

val specialList = Array("0742", "0763", "0780")

df.withColumn("strip_code", when(length($"codes") > 6, null).otherwise(
  when($"codes".isin(specialList: _*), $"codes").otherwise(
    regexp_replace($"codes", "^[0]*(\\d{4}.*?)[0]*$", "$1"))
  )
).show
// +-------+----------+
// |  codes|strip_code|
// +-------+----------+
// | 541100|      5411|
// |  54110|      5411|
// |  05810|      5810|
// | 581200|      5812|
// |  58140|      5814|
// |  54110|      5411|
// |  48140|      4814|
// | 481400|      4814|
// | 723000|      7230|
// |  52000|      5200|
// |   0742|      0742|
// |   0763|      0763|
// | 001234|      1234|
// |    123|       123|
// |1234560|      null|
// +-------+----------+
0 голосов
/ 05 июня 2018

Один простой способ:

df.show()

+------+
| value|
+------+
|541100|
| 54100|
| 05810|
|581200|
| 58140|
| 54110|
| 48140|
|481400|
|723000|
| 52000|
+------+

import org.apache.spark.sql.functions._
df.withColumn("cleanedValue",when(substring('value,1,1).rlike("0"),'value)
                            .otherwise(substring('value,1,4)))
                            .show() 

+------+------------+
| value|cleanedValue|
+------+------------+
|541100|        5411|
| 54100|        5410|
| 05810|       05810|
|581200|        5812|
| 58140|        5814|
| 54110|        5411|
| 48140|        4814|
|481400|        4814|
|723000|        7230|
| 52000|        5200|
+------+------------+     
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...