带有Spark Scala分隔符的子字符串

时间:2018-12-23 15:54:40

标签: scala apache-spark apache-spark-sql

我是Spark和Scala的新手,我想问一个问题:

我的数据库中有一个城市字段(我已经将它加载到了DataFrame中),其格式如下:"someLetters" + " - " + id + ')'.
示例:

ABDCJ - 123456)   
AGDFHBAZPF - 1234567890)

该字段的大小不是固定的,此处的id可以是6或10位的整数。因此,我想做的是将id提取到名为city_id的新列中。
具体来说,我想从数字的最后一个字符')'开始,忽略它并提取整数,直到找到一个空格。然后休息。

我已经尝试使用withColumnregex甚至subString index来做到这一点,但是我感到困惑,因为它们基于我无法在此处使用的索引。 >

我该如何解决?

5 个答案:

答案 0 :(得分:4)

  

以数字的最后一个字符')'开头,将其忽略,然后   提取整数,直到找到空格

这可以通过正则表达式模式.*?(\\d+)\\)$完成,其中\\)$与字符串末尾的)匹配,然后使用\\d+捕获数字并提取它作为新列;请注意,.*?(由于?会延迟匹配字符串,直到找到模式(\\d+)\\)$

df.withColumn("id", regexp_extract($"city", ".*?(\\d+)\\)$", 1)).show
+--------------------+----------+
|                city|        id|
+--------------------+----------+
|     ABDCJ - 123456)|    123456|
|AGDFHBAZPF - 1234...|1234567890|
+--------------------+----------+

答案 1 :(得分:2)

touchableopacity onpress function undefined (is not a function) React Native

import org.apache.spark.sql.functions._
val df=tempDF.withColumn("city_id",rtrim(element_at(split($"city"," - "),2),")"))

答案 2 :(得分:1)

假设输入的格式与您示例中的格式相同。
为了获得-之后的数字而没有结尾的),您可以执行以下命令:

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

上面的内容用-分隔,并获取第二个元素(即数字),并删除最后一个字符())。

您可以创建执行上述命令的udf,并使用withColumn命令创建新列

答案 3 :(得分:0)

我会去regex_extract,但是有很多选择:您也可以使用2个split来做到这一点:

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

首先,您将-拆分为第二个元素,然后将)拆分为第一个元素

或另一种选择,用-分割,然后放下)

df
.withColumn("id",
   reverse(
     substring(         
       reverse(split($"city"," - ")(1)),
       2,
       Int.MaxValue
     )
   )
)

答案 4 :(得分:0)

您还可以使用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>

由于id似乎是整数,因此可以将其强制转换为

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>