dataOf函数对数据帧

时间:2016-06-27 14:19:31

标签: apache-spark dataframe apache-spark-sql

我有一个包含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。知道我的错是什么以及如何解决它?

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|
+--------------------+-------------+