CSVデータをSpark DataFrameにロードしました。
このデータフレームを2つの異なるデータフレームにスライスする必要があります。各データフレームには、元のデータフレームの列のセットが含まれています。
列に基づいて、サブセットをSparkデータフレームに選択するにはどうすればよいですか?
データフレームを2つの異なるフレームに分割する場合は、必要な異なる列で2つの選択を行います。
val sourceDf = spark.read.csv(...)
val df1 = sourceDF.select("first column", "second column", "third column")
val df2 = sourceDF.select("first column", "second column", "third column")
もちろん、これはsourceDfが2回評価されることを意味するため、分散メモリに収まり、両方のデータフレームでほとんどの列を使用する場合は、キャッシュすることをお勧めします。必要のない余分な列がたくさんあるので、最初に選択して必要な列を選択すると、その余分なデータがすべてメモリに保存されます。
親データフレームに'n'列があるとします
'x' child DataFrames(この例では2を考えてみましょう)を作成できます。
子データフレームの列は、親データフレーム列のいずれかから必要に応じて選択できます。
ソースに10列があり、親データフレームから参照される列を含む2 DataFramesに分割することを検討してください。
子データフレームの列は、select Dataframe APIを使用して決定できます
val parentDF = spark.read.format("csv").load("/path of the CSV file")
val Child1_DF = parentDF.select("col1","col2","col3","col9","col10").show()
val child2_DF = parentDF.select("col5", "col6","col7","col8","col1","col2").show()
子データフレームの列数は長さが異なり、親データフレームの列数よりも少ないことに注意してください。
親データフレームの目的の列の位置インデックスを使用して、実際の名前を言及せずに列名を参照することもできます
最初に暗黙的にインポートするsparkは、$表記を使用して位置インデックスを使用して列にアクセスするためのヘルパークラスとして機能します。
import spark.implicits._
import org.Apache.spark.sql.functions._
val child3_DF = parentDF.select("_c0","_c1","_c2","_c8","_c9").show()
特定の条件に基づいて列を選択することもできます。子データフレームで偶数列のみを選択したいとしましょう。偶数のインデックス付き列とインデックスが '0'から始まることを参照することでも
val parentColumns = parentDF.columns.toList
res0: List[String] = List(_c0, _c1, _c2, _c3, _c4, _c5, _c6, _c7,_c8,_c9)
val evenParentColumns = res0.zipWithIndex.filter(_._2 % 2 == 0).map( _._1).toSeq
res1: scala.collection.immutable.Seq[String] = List(_c0, _c2, _c4, _c6,_c8)
次に、これらの列をparentDFから選択します。selectAPIにはseq型の引数が必要です。したがって、「evenParentColumns」をSeqコレクションに変換しました。
val child4_DF = parentDF.select(res1.head, res1.tail:_*).show()
これにより、親データフレームからのインデックス付きの偶数列が表示されます。
| _c0 | _c2 | _c4 | _c6 | _c8 |
| ITE00100554 | TMAX | null | E | 1 |
| TE00100554 | TMIN | null | E | 4 |
| GM000010962 | PRCP | null | E | 7 |
データフレームに偶数列が残っています
同様に、以下に示すように、Dataframe列に他の操作を適用することもできます
val child5_DF = parentDF.select($"_c0", $"_c8" + 1).show()
そのため、前述のさまざまな方法で、Dataframeの列を選択できます。
以下のコードを使用して、インデックス(位置)に基づいて列を選択できます。変数colNosの数値を変更して、それらの列のみを選択できます。
import org.Apache.spark.sql.functions.col
val colNos = Seq(0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35)
val Df_01 = Df.select(colNos_01 map Df.columns map col: _*)
Df_01.show(20, false)
解決済み、データフレームにselectメソッドを使用して列を選択するだけです:
val df=spark.read.csv("C:\\Users\\Ahmed\\Desktop\\cabs_trajectories\\cabs_trajectories\\green\\2014\\green_tripdata_2014-09.csv")
val df1=df.select("_c0")
これにより、データフレームの最初の列がサブセット化されます
Select select
を使用するだけで、特定の列を選択し、読み取り可能な名前を付けてキャストできます。たとえば、次のようなものです。
spark.read.csv(path).select(
'_c0.alias("stn").cast(StringType),
'_c1.alias("wban").cast(StringType),
'_c2.alias("lat").cast(DoubleType),
'_c3.alias("lon").cast(DoubleType)
)
.where('_c2.isNotNull && '_c3.isNotNull && '_c2 =!= 0.0 && '_c3 =!= 0.0)