我有一个列类型为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。知道我的错是什么,怎么解决吗?
问题是:
application_rules("apprul_cd_fare_basis").toString().indexOf("-")
这里的toString()
函数返回所选列的标题,这里是apprul_cd_fare_basis
。这不是你期望的价值。所以indexOf("-")
不是在值中搜索,而是在列标题中搜索。
如果您只想添加一列,其中包含从字符串中提取的部分(例如,从YX-1F2
中提取YX
),您可以简单地这样做:
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|
+--------------------+-------------+