web-dev-qa-db-ja.com

pySparkデータフレームに行IDを追加する方法

Csvファイルがあります。 pysparkでDataFrame(df)に変換します。いくつかの変換後; dfに列を追加します。これは単純な行ID(0または1からNまで)である必要があります。

Rddでdfを変換し、「zipwithindex」を使用します。結果のrddをdfに戻しました。このアプローチは機能しますが、250kのタスクを生成し、実行に多くの時間がかかります。実行時間が短い他の方法があるかどうか疑問に思っていました。

以下は私のコードのスニペットです。処理中のcsvファイルはBIGです。数十億行が含まれています。

debug_csv_rdd = (sc.textFile("debug.csv")
  .filter(lambda x: x.find('header') == -1)
  .map(lambda x : x.replace("NULL","0")).map(lambda p: p.split(','))
  .map(lambda x:Row(c1=int(x[0]),c2=int(x[1]),c3=int(x[2]),c4=int(x[3]))))

debug_csv_df = sqlContext.createDataFrame(debug_csv_rdd)
debug_csv_df.registerTempTable("debug_csv_table")
sqlContext.cacheTable("debug_csv_table")

r0 = sqlContext.sql("SELECT c2 FROM debug_csv_table WHERE c1 = 'str'")
r0.registerTempTable("r0_table")

r0_1 = (r0.flatMap(lambda x:x)
    .zipWithIndex()
    .map(lambda x: Row(c1=x[0],id=int(x[1]))))

r0_df=sqlContext.createDataFrame(r0_2)
r0_df.show(10) 
17
ankit patel

Sqlパッケージの関数を使用することもできます。一意のIDを生成しますが、パーティションの数に依存するため、シーケンシャルではありません。 Spark 1.5 +

_from pyspark.sql.functions import monotonicallyIncreasingId

# This will return a new DF with all the columns + id
res = df.withColumn("id", monotonicallyIncreasingId())
_

編集:19/1/2017

@ Sean のコメント通り

代わりにSpark 1.6以降からmonotonically_increasing_id()を使用してください

54
Arkadi T