2017-12-21 56 views
0

私はデータフレームを持っており、特定の行の行番号/インデックスを取得する必要があります。私はそれが行番号/インデックスだけでなく、文字を含むように新しい行を追加したいと思います。 "A - 1"、 "B - 2" 私はこのようなものになるように置く新しいアウトたいPySpark - UDFから行のインデックスを取得

+------+---------+ 
|Letter|distances| 
+------+---------+ 
|  A|  20| 
|  B|  30| 
|  D|  80| 
+------+---------+ 

出力と

#sample data 
a= sqlContext.createDataFrame([("A", 20), ("B", 30), ("D", 80)],["Letter", "distances"]) 

+------+---------------+ 
|Letter|distances|index| 
+------+---------------+ 
|  A|  20|A - 1| 
|  B|  30|B - 2| 
|  D|  80|D - 3| 
+------+---------------+ 

これは、私が働いている機能

def cate(letter): 
    return letter + " - " + #index 
a.withColumn("index", cate(a["Letter"])).show() 
+0

[この](https://stackoverflow.com/a/35948427/3433323)は役に立ちますか? (idsを作成し、行idを関数 'cate'の引数に渡します) – mkaran

答えて

2

あなたはUDFを使用して結果を達成したいので(のみ)のは、この

from pyspark.sql.functions import udf, monotonically_increasing_id 
from pyspark.sql.types import StringType 

#sample data 
a= sqlContext.createDataFrame([("A", 20), ("B", 30), ("D", 80)],["Letter", "distances"]) 

def cate(letter, idx): 
    return letter + " - " + str(idx) 
cate_udf = udf(cate, StringType()) 
a = a.withColumn("temp_index", monotonically_increasing_id()) 
a = a.\ 
    withColumn("index", cate_udf(a.Letter, a.temp_index)).\ 
    drop("temp_index") 
a.show() 

出力を試してみましょうです:おそらく

+------+---------+--------------+ 
|Letter|distances|   index| 
+------+---------+--------------+ 
|  A|  20|   A - 0| 
|  B|  30|B - 8589934592| 
|  D|  80|D - 8589934593| 
+------+---------+--------------+ 
+0

monotonically_increasing_id()は、指定された値から始まるシーケンスを提供するのではなく、ランダムなシーケンスを返します。 – Bala

+0

@Bala - ええ、true ...しかし、OPのユースケースでは、シーケンシャルインデックスとして使うことができると考えています。 – Prem

-1

これは動作するはずです

df = spark.createDataFrame([("A", 20), ("B", 30), ("D", 80)],["Letter", "distances"]) 
df.createOrReplaceTempView("df") 

spark.sql("select concat(Letter,' - ',row_number() over (order by Letter)) as num, * from df").show() 

+-----+------+---------+               
| num|Letter|distances| 
+-----+------+---------+ 
|A - 1|  A|  20| 
|B - 2|  B|  30| 
|D - 3|  D|  80| 
+-----+------+---------+ 
+0

これは良い解決策ですが、私はpysparkにUDFを使用することに拘束されています。 –

関連する問題