2017-07-20 10 views
0

私はこのような2つの列を持つデータフレームdfを持っています。このことから列内の別の列に文字列を作る方法

+-----+------------------+ 
|x |  y   | 
+-----+------------------+ 
|0.0 |{12,16,17,18,19} | 
|0.0 |{18,16,17,18,19} | 
|0.0 |{15,16,67,18,19} | 
|0.0 |{65,16,17,18,19} | 
|0.0 |{9,16,17,18,19} | 
|1.0 |{12,16,17,28,39} | 
|0.0 |{24,16,17,28,19} | 
|0.0 |{90,16,17,18,29} | 
|1.0 |{30,16,17,18,19} | 
|1.0 |{28,16,17,18,19} | 
+-----+------------------+ 

私は列が文字列型

ある。しかし、それはyの列に同じことを印刷している両

println(df .withColumn("y", df("y".replace("{", "").replace("}","").split(",")(0))).show) 

で試してみました

+---+---+ 
|x |y | 
+---+---+ 
|0 |12 | 
|0 |18 | 
|0 |15 | 
|0 |65 | 
|0 |9 | 
|1 |12 | 
|0 |24 | 
|0 |90 | 
|1 |30 | 
|1 |28 | 
+---+---+ 

のようなものを望んでいました 何か助けていただければ幸いです。

答えて

2

Sparkの組み込み列関数を使用する必要があります。

import org.apache.spark.sql.Column 
import org.apache.spark.sql.functions._ 

import spark.implicits._ 

val df = Seq(
    ("0.0", "{12,16,17,18,19}"), 
    ("0.0", "{18,16,17,18,19}"), 
    ("0.0", "{15,16,67,18,19}"), 
    ("0.0", "{65,16,17,18,19}"), 
    ("0.0", "{9,16,17,18,19}"), 
    ("1.0", "{12,16,17,28,39}"), 
    ("0.0", "{24,16,17,28,19}"), 
    ("0.0", "{90,16,17,18,29}"), 
    ("1.0", "{30,16,17,18,19}"), 
    ("1.0", "{28,16,17,18,19}") 
).toDF("x", "y") 

def firstItem(column: Column): Column = split(
    regexp_replace(column, "[{}]", ""), 
    "," 
).getItem(0) 

df.withColumn("y", firstItem(df("y"))).show 

に結果として得られる:functionsパッケージドキュメントのと(getItem法用)Columnクラスのドキュメントで

+---+---+ 
| x| y| 
+---+---+ 
|0.0| 12| 
|0.0| 18| 
|0.0| 15| 
|0.0| 65| 
|0.0| 9| 
|1.0| 12| 
|0.0| 24| 
|0.0| 90| 
|1.0| 30| 
|1.0| 28| 
+---+---+ 

詳細情報ここでは一例です。

複雑な変換が必要で、組み込み関数では不十分な場合は、ユーザー定義関数(UDF)を使用できます。 UDFの詳細については、hereをご覧ください。

+0

をうん、 – Ricky

+0

@Daniel・デ・パウラwell.thanksを働いたと一緒に使用するために 'COLUMN'タイプを受け入れるUDFを作成し、通常の関数を作成する間のパフォーマンスの面で違いがあります'.withColumn()'? – vdep

+1

@vdep UDFはSparkの「ブラックボックス」であるため、UDFを定義する前に常に組み込み関数を使用するようにしてください。最適化する。 [ここにリンクがあります](https://jaceklaskowski.gitbooks.io/mastering-apache-spark-2/spark-sql-udfs.html)。 –

1

あなたは試すことができます:

df.withColumn("y", regexp_extract($"y", "(\\{)([0-9]*)",2)).show() 

+---+---+ 
| x| y| 
+---+---+ 
|0.0| 12| 
|0.0| 18| 
|0.0| 15| 
|0.0| 65| 
|0.0| 9| 
|1.0| 12| 
|0.0| 24| 
|0.0| 90| 
|1.0| 30| 
|1.0| 28| 
+---+---+ 
関連する問題