2017-12-21 40 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) 도움이 될 수 있습니까? (id를 생성하고 인자'cate'에 인자로 행 id를 넘깁니다.) – 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 - 네, 사실입니다 ...하지만 그것은 순차 인덱스로 사용할 수 있다고 생각합니다. – 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를 사용하도록 제한되어 있습니다. –