2016-06-27 8 views
0

String型の列を持つテーブルがあります。私は、キャラクタ " - "の位置によって定義されるチェーンの一部を持つ別の列を取得したい。データフレームのindexOf関数

例:列の値が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

は問題です:

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| 
+--------------------+-------------+ 
関連する問題