我有一个包含String类型列的表。我希望得到另一个列,其中包含链接的一部分,由字符“ - ”的位置定义。
示例:该列的值为YX-1F2,我希望将YX作为列。
这是我到目前为止所尝试的:
application_rules.where((application_rules("apprul_cd_fare_basis").contains("-")===true) && (application_rules("apprul_cd_fare_basis").startsWith("-")===false) && (application_rules("apprul_cd_fare_basis").endsWith("-")===false))
.select(application_rules("apprul_cd_fare_basis"), application_rules("apprul_cd_fare_basis").substr(0, application_rules("apprul_cd_fare_basis").toString().indexOf("-")))
.show()
但是这对我不起作用,因为我总是将indexOf(“ - ”)函数返回-1。知道我的错是什么以及如何解决它?
答案 0 :(得分:1)
问题在于:
application_rules("apprul_cd_fare_basis").toString().indexOf("-")
此处toString()
功能会返回所选列的标题,此处为apprul_cd_fare_basis
。这不是您期望的价值。因此indexOf("-")
不会搜索值,而是搜索列标题。
<强>解决方案强>
如果您只想添加一个包含字符串中提取部分的列(例如YX
中的YX-1F2
),您可以这样做:
import org.apache.spark.sql.functions.substring_index
application_rules.withColumn(
"newColumnName",
substring_index(application_rules("apprul_cd_fare_basis"), "-", 1)
)
<强>结果强>
+--------------------+-------------+
|apprul_cd_fare_basis|newColumnName|
+--------------------+-------------+
| YX-1F2| YX|
| AB-0G1| AB|
+--------------------+-------------+