2016-04-05 5 views
1

collectを使用せずにn番目の行をデータフレームから削除してからdataFrameに戻すことは可能ですか?私は大きなデータセットを持っているので、collectを使わないようにしたい。Spark Scala Dataframe:n番目のレコードを削除する

val arr=df.collect().toBuffer 
arr.remove(13) 

何とか私はデータフレームに戻すことができます。簡単な方法がありますか? は私がzipwithIndexが、データフレームがzipwithIndex

私はRDDを変換すると、それを変換するよりも優れていると言うでしょうスパーク用語ので
value zipWithIndex is not a member of org.apache.spark.sql.DataFrame 

答えて

0

をサポートしていませんみました。 これを非常に効率的に行うためにfilterメソッドを使用することを提案する1つの例を次に示します。 この例では、必ずindexカラムを持つ必要があります。

import org.apache.spark.sql._ 

val list = Seq(("one", 1), ("two", 2), ("three", 3),("four", 4),("five", 5)) 
val sqlContext = new SQLContext(sc) 

val numdf = sqlContext.createDataFrame(list) 
numdf.printSchema() 

root 
|-- _1: string (nullable = true) 
|-- _2: integer (nullable = false) 

newdf = numdf.filter(numdf("_2")<2 or numdf("_2")>2).show() 

ここは私の#bluemix notebookです。

ありがとう、

チャールズ。

3

私が知る限り、DataFrameではこれをサポートしていません.RDD APIを使用する必要があります。すぐ後でDataFrameに変換することができます。

これは、すべてのデータをドライバにコピーするcollectを使用する場合と非常に異なることに注意してください。

val filteredRdd = input.rdd.zipWithIndex().collect { case (r, i) if i != 13 => r } 
val newDf = sqlContext.createDataFrame(filteredRdd, input.schema) 

(ここで使用collectドライバにデータを収集するものではありません、それはフィルタリングと1回の呼び出しでのマッピングを行うには部分関数を適用)。

免責事項: SparkのDataFramesは、不変のデータ構造であるという意味でRDDのようなものです。したがって、この種の影響がSparkの原則に反するため、新しい列の作成や行の削除、DataFrame内の単一の要素へのインデックスへのアクセスなどは存在できません。メモリ内ランダムアクセスデータ構造ではなく、分散データ構造を使用していることを忘れないでください。

これは、Sparkを使用して同じ種類の操作(つまり、新しい列の作成)を行うことができないということを意味しているわけではありません。つまり、不変の/分散した部分を考え直さなければならないということです。あなたのコード、主に純粋にデータストリーム上の変換とは考えられない部分です。

+1

私はあなたが気にしない限り、自分の答えに小さなセクションを追加することができました! ;) – eliasah

+2

よく置いて、@ eliasah、ありがとう:) –

+0

私はほとんどのOPの質問に問題を気づいた。彼らは実際にはほとんどの場合、機能的なパラダイムや不変性を理解していないので、私はむしろ毎回それらを思い出させるでしょう...: -/ – eliasah

関連する問題