我是Spark和Scala的新手,我想问一个问题:
我的数据库中有一个城市字段(我已经将它加载到了DataFrame中),其格式如下:"someLetters" + " - " + id + ')'.
示例:
ABDCJ - 123456)
AGDFHBAZPF - 1234567890)
该字段的大小不是固定的,此处的id
可以是6或10位的整数。因此,我想做的是将id
提取到名为city_id
的新列中。
具体来说,我想从数字的最后一个字符')'开始,忽略它并提取整数,直到找到一个空格。然后休息。
我已经尝试使用withColumn
或regex
甚至subString index
来做到这一点,但是我感到困惑,因为它们基于我无法在此处使用的索引。 >
我该如何解决?
答案 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>